Emacs: выделение TODO * только* в комментариях
этот вопрос связан с другим,Emacs: индикатор TODO с левой стороны. Недавно я столкнулся с незначительным режимом, который мне очень нравится под названием FixmeMode. Он поддерживает автоматическую подсветку TODO метки и навигация между ними. Однако я думаю, что имеет смысл распознавать строки "TODO" только в комментариях, а не загрязнять весь файл. Возможно ли это?
3 ответов
Проверьте библиотеку fic-режим.el, это было проверено в C++ и Emacs-Lisp.
это было написано специально, чтобы ответить на этот вопрос.
установка похожа на любой стандартный пакет:
(require 'fic-mode)
(add-hook 'c++-mode-hook 'turn-on-fic-mode)
хотя Вэй Ху для простой способ, чтобы добавить его в несколько режимов, так вот:
(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)
это возможно, но немного сложнее. Режим вообще использует font-lock
чтобы сделать его подсветку, поэтому он работает на основе типа "как вы", чтобы выделить ключевые слова. Font-lock подключается на очень низком уровне, в основном работает после каждого изменения содержимого буфера. Однако он оптимизирован, что позволяет ему мгновенно появляться на современных компьютерах.
индикатор TODO в левой кромке статичен. Выполните функцию и все текущие задачи будут выделены; изменение буфера (добавление или удаление TODO) не изменяет индикатор fringe; это изменяется только при повторном запуске функции.
ваш подход должен был бы попасть в синтаксические таблицы, определяя сначала, когда вы находитесь в комментарии, а затем ищете ключевые слова. Сложная часть заключается в том, чтобы делать это интерактивно (т. е. по мере ввода). Вы должны быть в состоянии подключиться к font-lock
конструирует для этого, но функция, которую вы предоставляете для поиска таблицы синтаксиса комментария, а затем для ключевых слов лучше быть очень эффективным, так как он будет запускаться каждый раз при изменении буфера (хотя он будет работать только на измененном регионе, я думаю). Вы хотели бы засунуть все это в font-lock-syntactic-keywords
, а не font-lock-keywords
- за синтаксических-сайта пройти бывает перед синтаксических пройти (что случается до сайта проходят), и нужно установить todo в комментариях, прежде чем комменты сами устанавливаются.
извините, это не полный рабочий код ответа.....
может быть, это поможет: есть fn c-in-literal
in
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))))))))))