Emacs: выделение только TODO * в комментариях - PullRequest
17 голосов
/ 03 марта 2010

Этот вопрос относится к другому, Emacs: Индикатор TODO слева . Недавно я столкнулся с второстепенным режимом, который мне очень нравится, и называется FixmeMode . Он поддерживает автоматическое выделение меток TODO и навигацию между ними. Тем не менее, я думаю, что имеет смысл распознавать строки «TODO» только в комментариях, а не загрязнять весь файл. Возможно ли это?

Ответы [ 3 ]

24 голосов
/ 10 октября 2010

Проверьте библиотеку fic-mode.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)
3 голосов
/ 03 марта 2010

Это возможно, но немного сложнее. В режиме Fixme для выделения выделяется font-lock, поэтому он работает по мере ввода текста для выделения ключевых слов. Font-lock фиксируется на очень низком уровне, в основном работает после каждого изменения содержимого буфера. Тем не менее, он сильно оптимизирован, что позволяет мгновенно появляться на современных компьютерах.

Индикатор TODO на левой стороне статичен. Выполните функцию, и все текущие TODO будут выделены; изменение буфера (добавление или удаление TODO) не меняет индикатор бахромы; это изменяется только при повторном запуске функции.

Ваш подход должен был бы войти в таблицы синтаксиса, сначала определить, когда вы находитесь в комментарии, а затем искать ключевые слова. Сложнее всего сделать это интерактивно (то есть, когда вы печатаете). Вы должны быть в состоянии подключиться к конструкциям font-lock, чтобы сделать это, но функция, которую вы предоставляете для поиска таблицы синтаксиса комментариев, а затем для ключевых слов, должна быть очень эффективной, так как она будет выполняться каждый раз, когда меняется буфер (хотя он будет работать только в измененном регионе, я думаю). Вы хотели бы поместить все это в font-lock-syntactic-keywords, а не font-lock-keywords, потому что проход по синтаксическому ключевому слову происходит до синтаксического прохода (что происходит до прохода ключевого слова), и вам нужно установить TODO внутри комментариев перед тем, как будут установлены сами комментарии .

Извините, это не полный рабочий код ..... ..... 1011 *

2 голосов
/ 03 марта 2010

Может быть, это поможет: есть Fn c-in-literal в cc-mode и аналогичный 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))))))))))
...