这个问题涉及到另一个问题:Emacs :TODO indicator at left side。我最近发现了一个我非常喜欢的小模式,叫做FixmeMode。它支持自动突出显示TODO标记,并在它们之间导航。然而,我认为只有在注释中识别“TODO”字符串才比污染整个文件更有意义。这可行吗?
这个问题涉及到另一个问题:Emacs :TODO indicator at left side。我最近发现了一个我非常喜欢的小模式,叫做FixmeMode。它支持自动突出显示TODO标记,并在它们之间导航。然而,我认为只有在注释中识别“TODO”字符串才比污染整个文件更有意义。这可行吗?
请查看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)
font-lock
来进行突出显示,因此它可以在您键入时按照关键字进行突出显示。Font-lock钩子在非常低的级别上起作用,基本上在对缓冲区内容进行任何更改后运行。尽管如此,它经过了高度优化,这使得它在现代计算机上看起来是即时的。font-lock
构造以执行此操作,但是您提供的搜索注释语法表和关键字的函数最好非常高效,因为每次缓冲区更改时都会运行它(尽管我认为它只会在更改区域上运行)。您需要将所有这些内容放入font-lock-syntactic-keywords
而不是font-lock-keywords
,因为在设置注释之前需要在注释中设置TODO,而注释本身在语法分析(在关键字分析之前)之前进行设置。c-in-literal
的函数,在csharp模式中有一个类似的csharp-in-literal
函数。如果处于C样式注释中,则返回值为c
,如果处于C++样式注释中,则返回值为c++
。您可以将其添加到Emacs :TODO indicator at left side的代码中以获得所需的结果。(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))))))))))
fic-modes
会很好,它可以用来定义所有已启用的模式,而不必逐个添加到模式挂钩中。 - Wei Hu'fic-search-for-keyword
),并且该例程只验证该字符串是否在注释/字符串中。 - Trey Jackson