Size: a a a

Emacs — русскоговорящее сообщество

2020 March 15

IG

Ivan Grishaev in Emacs — русскоговорящее сообщество
for(int c; (c = getchar()) != EOF;)
Каким образом можно подсветить некоторые комментарии в с++? Конкретно я хочу сделать так чтобы // --- text --- // подсвечивалось используя font-lock-warning-face. Для самой подсветки я сделал (если убрать // то все работает нормально)

(font-lock-replace-keywords
'c++-mode
`((,(rx "// --- " (*? anything) " --- //") . 'font-lock-warning-face)))


но если оставить // ничего не меняется при подсветке. Я поискал примеры но в конечном итоге ничего не смог найти - для комментариев с документацией посдветку можно перенастроить но про обычные комментарии просто сказано что "Normal comments are fontified in font-lock-comment-face."
у меня такой костылик:
(defun hl-todos ()
 (highlight-lines-matching-regexp "todo\\|TODO\\|Todo" 'hi-yellow-b))
(add-hook 'python-mode-hook #'hl-todos)
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Emacs — русскоговорящее сообщество
эмммм
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Emacs — русскоговорящее сообщество
пакет же есть
источник

IG

Ivan Grishaev in Emacs — русскоговорящее сообщество
какой?
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Emacs — русскоговорящее сообщество
hl-todo
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Emacs — русскоговорящее сообщество
(use-package hl-todo
 :ensure t
 :custom-face
 (hl-todo ((t (:inherit hl-todo :italic t))))
 :hook ((prog-mode . hl-todo-mode)
        (yaml-mode . hl-todo-mode)))
источник

IG

Ivan Grishaev in Emacs — русскоговорящее сообщество
а, я думал про курсор.
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Emacs — русскоговорящее сообщество
не
источник

PG

Pïg Grëënëst in Emacs — русскоговорящее сообщество
GNU/😈👾Scriptod👾😈 ( λ )
а почему ето :custom в юзпекиже не работает
а ты use-package-custom поставил или его вмержили?
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Emacs — русскоговорящее сообщество
Pïg Grëënëst
а ты use-package-custom поставил или его вмержили?
его очень давно вмержили
источник

IG

Ivan Grishaev in Emacs — русскоговорящее сообщество
с хайлайтом можно подсвечивать не только тудухи, а что угодно
источник

PG

Pïg Grëënëst in Emacs — русскоговорящее сообщество
GNU/😈👾Scriptod👾😈 ( λ )
(use-package emacs
 :ensure t
 :config
 (setq use-dialog-box -1)
 (setq tool-bar-mode -1)
 (setq menu-bar-mode -1)
 (setq scroll-bar-mode -1)
 (setq blink-cursor-mode -1)
 (setq scroll-step 1)
 (setq inhibit-splash-screen t)
 (setq initial-scratch-message -1)

 (setq indicate-empty-lines t)
 (setq indicate-buffer-boundaries 'left)
 (setq indent-tabs-mode -1)
 (setq tab-width 4))


спиздил у @docker, so it should work
а вот за такое надо ногами пиздить
источник

f

for(int c; (c = getchar()) != EOF;) in Emacs — русскоговорящее сообщество
Ivan Grishaev
у меня такой костылик:
(defun hl-todos ()
 (highlight-lines-matching-regexp "todo\\|TODO\\|Todo" 'hi-yellow-b))
(add-hook 'python-mode-hook #'hl-todos)
Да, это работает как ожидается, спасибо
источник

f

for(int c; (c = getchar()) != EOF;) in Emacs — русскоговорящее сообщество
Хотя если кто-нибудь знает каким образом это все же сделать через font-lock то это было бы лучше - если я правильно понял то что написно в документации highlight-lines-matching-regexp работает поверх того что уже есть и позволяет только накладывать новую подсветку в дополнение к тому что уже есть - то есть какие-то больее сложные вещи все равно сделать нельзя.
источник

PG

Pïg Grëënëst in Emacs — русскоговорящее сообщество
а какие более сложные вещи тебе нужны?
источник

PG

Pïg Grëënëst in Emacs — русскоговорящее сообщество
вообще, ты уверен что хочешь патчить подсветку C++ мода, а не сделать минорный мод для своей подсветки?
источник

f

for(int c; (c = getchar()) != EOF;) in Emacs — русскоговорящее сообщество
Я опять забыл про минорный мод, но с ним тоже ничего не работает:

(setq
kwds
`((,(rx "// --- " (*? anything) " --- //") . 'font-lock-warning-face)))

(define-minor-mode c++-additional-comments-mode "Doc string."
 nil "c++-additional-comments" nil
 (font-lock-add-keywords nil kwds)
 (font-lock-fontify-buffer))


в обычном буфере все подсвечиват как надо, но если c++-mode то никакних изменений
источник

f

for(int c; (c = getchar()) != EOF;) in Emacs — русскоговорящее сообщество
Pïg Grëënëst
а какие более сложные вещи тебе нужны?
Пока я еще не до конца разобрался с тем как работают сложные подсветки, но если я все правильно понял то помимо обычных регулярных выражений которые подсвечивают все одинаково можно еще делать такие которые подсвечивают части по разному (ссылка) - мне бы хотелось подсвечивать именно комментарии более заметным образом
источник

PG

Pïg Grëënëst in Emacs — русскоговорящее сообщество
да, можно, но, насколько я понимаю, здесь проблема в том, что часть, которую мы хотим подсветить, уже подсвечена другим правилом
источник

f

for(int c; (c = getchar()) != EOF;) in Emacs — русскоговорящее сообщество
У меня получилось подсветить --- text --- внутри строки при помощи кода адаптированного отсда, но я совершенно не могу понять как происходит определение того что мы находимся в строке.

(defun c++-additional-keyword-matcher (end)
 (let (pos (case-fold-search t))
   (while (and (setq pos
                     (re-search-forward
                      (rx "--- " (*? anything) " ---") end t))
               (null (nth 3 (syntax-ppss pos)))))
   pos))

(defun c++-add-additional-keyword-matcher ()
 (font-lock-add-keywords
  nil
  '((c++-additional-keyword-matcher 0 'font-lock-warning-face t))
  'append))

(add-hook 'c++-mode-hook  'c++-add-additional-keyword-matcher)


Вот то что у меня получилось в конечном итоге - может быть если понять как определяется то что мы в строке я смогу применить тоже самое для комментариев
источник