【问题标题】:How can I highlight tags in Emacs buffers?如何突出显示 Emacs 缓冲区中的标签?
【发布时间】:2013-10-21 02:55:59
【问题描述】:

我使用 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

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

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

【问题讨论】:

  • 已编辑以解决问题中@Drew 的评论。

标签: emacs elisp


【解决方案1】:

也许吧,但您所说的“这样的突出显示”,尤其是“基于 TAGS 文件的内容”,并不是很清楚。

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

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

但也许您是说您从 TAGS 文件中获得了名称 my_function,并且您想要字体锁定(在 f90-mode 中)每个名称列在 @987654326 @ 被定义。如果是这种情况,那么是的,您可以解析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。

【讨论】:

  • 是的,你肯定明白我的问题。感谢您的精彩见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多