如何在Emacs缓冲区中突出显示标签?

时间:2013-10-20 15:02:00

标签: emacs elisp

我使用find-tagkill-this-buffer

等键绑定的帮助下浏览Fortran 90代码
(global-set-key [(control return)] 'find-tag ) ;
(global-set-key (kbd "C-w") 'kill-this-buffer) ;

这为代码浏览提供了相对流畅的体验。不幸的是,并非所有标签都具有相同的突出显示。所以我最终使用像

这样的表达式手动添加目标到font-lock-keywords
(add-hook 'after-change-major-mode-hook
          (lambda ()
            (font-lock-add-keywords 'f90-mode
              '(
                ("\\(my_function\\)" 1 font-lock-function-name-face t )
                ))))

在我的~/.emacs.d/init.el

是否有一个解决方案可以突出显示TAGS文件中列出的每个名称,如果它出现在f90模式的缓冲区中?

我最感兴趣的是f90-mode的解决方案,但当然一般解决方案会更好。

1 个答案:

答案 0 :(得分:1)

也许吧,但是“你这样的突出显示”是什么意思,特别是“基于TAGS文件的内容”,这一点并不太清楚。

  • “此类突出显示” - 字体锁定突出显示用于查看缓冲区,在本例中为f90-mode中的缓冲区。因此,您确实需要为该模式添加字体锁定,无论如何。这与您进入模式的方式无关(从访问TAGS或以其他方式)。

  • “基于TAGS文件的内容” - 这些内容将告诉您定义了哪些名称(以及在哪里),但仅此而已。

但也许你说你从my_function文件中得到名称TAGS,并且你想要字体锁定(在f90-mode中)每个名字TAGS中列出已定义。如果是这种情况,那么您可以解析TAGS以获取已定义名称的列表,并将font-lock-keywords中的每一个添加到f90-mode。您可以使用(tags-completion-table)获取TAGS中的标记列表(已定义的名称)。

只需使用mapatoms迭代(tags-completion-table)返回的obarray。函数参数将为符号添加font-lock-keywords条目。像这样(未经测试):

(defun foo ()
  (require 'etags)
  (let ((defined-symbs  (tags-completion-table)))
    (mapatoms (lambda (symb)
                (font-lock-add-keywords
                  'f90-mode `((,(format "\\(%s\\)" symb)
                              1 font-lock-function-name-face t)))))))

但要注意(a)需要一段时间才能执行,(b)添加 TAGS表中定义的每个 符号,所以它将在f90-mode中变为字体锁定状态。这真的是你想要的吗?如果您的TAGS表是专门从(仅)Fortran文件创建的,那么这可能是有意义的;否则,也许不会。

由于可能需要一段时间,因此您只需调用foo一次,而不是每次输入f90-mode。更新TAGS文件后,您可以再次执行此操作,以获取任何更改。如果(b)是一个考虑因素,那么你可以在函数arg中添加一些过滤测试到mapatoms,这样只有某些符号才能被字体锁定。

无论如何,也许这会让你开始。 HTH。