Emacs: выделение только TODO * в комментариях
Этот вопрос связан с другим, индикатором Emacs:TODO слева. Недавно я столкнулся с второстепенным режимом, который мне очень нравится, называется FixmeMode. Он поддерживает автоматическое выделение меток TODO и навигацию между ними. Тем не менее, я думаю, что более разумно распознавать строки "TODO" только в комментариях, а не загрязнять весь файл. Является ли это возможным?
4 ответа
Проверьте библиотеку fic-mode.el, она была проверена в C++ и Emacs-Lisp.
Это было написано специально, чтобы ответить на этот вопрос.
Установка похожа на любой стандартный пакет:
(require 'fic-mode)
(add-hook 'c++-mode-hook 'turn-on-fic-mode)
Хотя Wei Hu попросил простой способ добавить его в несколько режимов, вот так:
(defun add-something-to-mode-hooks (mode-list something)
"helper function to add a callback to multiple hooks"
(dolist (mode mode-list)
(add-hook (intern (concat (symbol-name mode) "-mode-hook")) something)))
(add-something-to-mode-hooks '(c++ tcl emacs-lisp) 'turn-on-fic-mode)
Это возможно, но немного сложнее. Режим Fixme использует font-lock
сделать его подсветку, чтобы он работал по мере ввода текста для выделения ключевых слов. Font-lock подключается на очень низком уровне, в основном работает после каждого изменения содержимого буфера. Тем не менее, он сильно оптимизирован, что позволяет мгновенно появляться на современных компьютерах.
Индикатор TODO на левой стороне статичен. Выполните функцию, и все текущие TODO будут выделены; изменение буфера (добавление или удаление TODO) не меняет индикатор бахромы; это меняется только когда функция запускается снова.
Ваш подход должен был бы войти в таблицы синтаксиса, сначала определить, когда вы находитесь в комментарии, а затем искать ключевые слова. Сложнее всего сделать это интерактивно (то есть, когда вы печатаете). Вы должны быть в состоянии подключиться к font-lock
конструирует это, но функция, которую вы предоставляете для поиска таблицы синтаксиса комментариев, а затем для ключевых слов, должна быть очень эффективной, так как она будет запускаться каждый раз при изменении буфера (хотя он будет работать только в измененной области, Я думаю). Вы хотели бы заполнить все это в font-lock-syntactic-keywords
скорее, чем font-lock-keywords
потому что передача синтаксического ключевого слова происходит до синтаксического прохода (что происходит до прохода ключевого слова), и вам нужно установить TODO внутри комментариев до того, как сами комментарии будут установлены.
Извините, это не полный рабочий код ответа.....
Может быть, это поможет: есть фн c-in-literal
в режиме cc, и аналогичный csharp-in-literal
в режиме csharp. Возвращаемое значение c
если в комментарии в стиле C, c++
если в комментарии стиля C++. Вы можете добавить это к коду на индикаторе Emacs:TODO слева, чтобы получить то, что вы хотите.
(defun annotate-todo ()
"put fringe marker on TODO: lines in the curent buffer"
(interactive)
(let (lit)
(save-excursion
(goto-char (point-min))
(while (re-search-forward "TODO:" nil t)
(progn
(setq lit (c-in-literal)) ;; or csharp-in-literal
(if (or (eq lit 'c) (eq lit 'c++))
(let ((overlay (make-overlay (- (point) 5) (point))))
(overlay-put overlay 'before-string
(propertize "A"
'display
'(left-fringe ;; right
horizontal-bar
better-fringes-important-bitmap))))))))))
https://github.com/tarsius/hl-todo , кажется, делает именно то, что вы хотите. Я просто попробовал это и люблю это.