19

这个问题与另一个问题有关,Emacs :TODO 指示器在左侧。我最近遇到了一种我非常喜欢的次要模式,称为FixmeMode。它支持自动突出显示TODO标记,并在它们之间导航。但是,我认为仅在注释中识别“TODO”字符串而不是污染整个文件更有意义。是否可以?

4

3 回答 3

25

查看库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)
于 2010-10-10T11:10:12.283 回答
3

这是可能的,但相当棘手。Fixme 模式用于font-lock突出显示,因此它可以在键入时突出显示关键字。字体锁定挂钩在非常低的级别,基本上在每次更改缓冲区内容后运行。不过,它经过高度优化,可以在现代计算机上即时显示。

左边缘的 TODO 指示器是静态的。执行该函数,所有当前的 TODO 都会被高亮显示;更改缓冲区(添加或删除 TODO)不会更改边缘指标;只有当函数再次运行时才会改变。

您的方法必须进入语法表,首先确定您何时在评论中,然后查找关键字。棘手的部分在于以交互方式执行此操作(即在您键入时)。您应该能够挂钩font-lock结构来执行此操作,但是您提供的用于搜索注释语法表然后搜索关键字的功能非常有效,因为它会在每次缓冲区更改时运行(尽管它我认为只会在更改后的区域上运行)。您可能希望将所有这些都塞进去,font-lock-syntactic-keywords而不是font-lock-keywords因为语法关键字传递发生在语法传递之前(发生在关键字传递之前),并且您需要在注释本身设置之前在注释中设置 TODO。

抱歉,这不是一个完整的工作代码答案.....

于 2010-03-03T13:29:56.453 回答
2

也许这会有所帮助:在 cc 模式中有一个 fn ,在 csharp 模式中c-in-literal有一个类似的。如果在 C 风格的注释中,则csharp-in-literal返回值是在C++ 风格的注释中。您可以将其添加到 Emacs 的代码中:左侧的 TODO 指示器 以获得您想要的。cc++

(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))))))))))
于 2010-03-03T13:33:50.990 回答