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))))))))))