Emacs:在注释中突出显示TODO*仅*

Emacs:在注释中突出显示TODO*仅*,emacs,comments,elisp,highlighting,todo,Emacs,Comments,Elisp,Highlighting,Todo,这个问题与另一个有关。我最近遇到了一个我非常喜欢的小模式,叫做。它支持自动突出显示待办事项标记,并在它们之间导航。但是,我认为只在注释中识别“TODO”字符串更有意义,而不是污染整个文件。有可能吗?有可能,但有点棘手。Fixme模式使用字体锁定进行高亮显示,因此它会在键入时高亮显示关键字。字体锁定在一个非常低的级别,基本上是在每次更改缓冲区的内容后运行。不过,它经过了高度优化,可以在现代计算机上即时显示 左侧条纹中的TODO指示器是静态的。执行该功能并突出显示所有当前TODO;更改缓冲区(添加或

这个问题与另一个有关。我最近遇到了一个我非常喜欢的小模式,叫做。它支持自动突出显示待办事项标记,并在它们之间导航。但是,我认为只在注释中识别“TODO”字符串更有意义,而不是污染整个文件。有可能吗?

有可能,但有点棘手。Fixme模式使用
字体锁定
进行高亮显示,因此它会在键入时高亮显示关键字。字体锁定在一个非常低的级别,基本上是在每次更改缓冲区的内容后运行。不过,它经过了高度优化,可以在现代计算机上即时显示

左侧条纹中的TODO指示器是静态的。执行该功能并突出显示所有当前TODO;更改缓冲区(添加或删除TODO)不会更改条纹指示器;只有当函数再次运行时才会更改

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


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

也许这会有所帮助:在中有一个fn
c-in-literal
cc模式,以及csharp模式中类似的
csharp(文字)
。这个 返回值为“代码> C <代码> >如果在C风格的注释中,则在C++中使用代码> > C++ >代码> 风格评论。您可以在以下位置将其添加到代码中: 得到你想要的

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

查阅库,已在C++和Emacs Lisp中验证过。p> 它是专门为回答这个问题而写的

安装类似于任何标准包:

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

谢谢你的回答。我真的很想得到一个比fixmomede更好的答案,因为它是基于你输入的,正如@Joe所说的。是的,这是有道理的。作为一个补充,我认为突出显示屏幕上已经出现的内容,不如在源代码中提供FIXME的大致位置的视觉指示有用。visualdiff工具可以做到这一点,Eclipse在显示编译错误时也是如此,我认为visualstudio也是如此。我分别问了这个问题:这比我想象的更容易,也更棘手。更简单的是,整个字体锁定钩子和连接并没有那么难,但是非常非常难,因为要知道你是否在评论中是很难的。至少到目前为止我还没弄明白。所以还没有代码示例……做得很好,谢谢!你能简单地解释一下你是如何用这么少的代码解决这个任务的吗?另外,如果有一个可自定义的变量
fic modes
,它可以用来定义所有启用的模式,而不是一个接一个地添加到模式挂钩,那就太好了。@WeiHu至于如何用这么少的代码来解决这个问题,值得一读代码-字体锁提供了一个足够丰富的框架来解决这个问题。真正的关键是使用一个字体锁定设置,该设置调用一个例程(而不仅仅是一个regexp),该例程确定要突出显示哪些字符串(即
'fic-search-for-keyword
),该例程只验证字符串是否在注释/字符串中。因此,您利用了字符串和注释使用特殊字体面的事实。会有误报吗?@WeiHu因为只有将FIXME标记为字符串/注释时才能识别它,所以只有在字体锁定对这些类型有误报时才会发生误报。