如何突出显示Emacs缓冲区中的标记?

如何突出显示Emacs缓冲区中的标记?,emacs,elisp,Emacs,Elisp,我使用find tag和kill this buffer在键绑定的帮助下浏览Fortran 90代码,如 (global-set-key [(control return)] 'find-tag ) ; (global-set-key (kbd "C-w") 'kill-this-buffer) ; 这在代码浏览方面提供了相对流畅的体验。不幸的是,并非我所有的标签都有相同的突出显示。因此,我最终使用如下表达式手动将目标添加到字体锁定关键字中 (add-hook 'after-change-ma

我使用
find tag
kill this buffer
在键绑定的帮助下浏览Fortran 90代码,如

(global-set-key [(control return)] 'find-tag ) ;
(global-set-key (kbd "C-w") 'kill-this-buffer) ;
这在代码浏览方面提供了相对流畅的体验。不幸的是,并非我所有的标签都有相同的突出显示。因此,我最终使用如下表达式手动将目标添加到字体锁定关键字中

(add-hook 'after-change-major-mode-hook
          (lambda ()
            (font-lock-add-keywords 'f90-mode
              '(
                ("\\(my_function\\)" 1 font-lock-function-name-face t )
                ))))
在my
~/.emacs.d/init.el

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


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

也许吧,但不太清楚您所说的“此类突出显示”是什么意思,尤其是“基于标记文件的内容”

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

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

但是,您可能是说您从
标记
文件中获得了名称
my_函数
,并且希望按定义对
标记
中列出的每个名称进行字体锁定(在
f90模式下
)。如果是这种情况,那么是的,您可以解析
标记
以获得已定义名称的列表,并将每个名称添加到
字体锁定关键字
(对于
f90模式
)。您可以使用
(标记完成表)
获取
标记中的标记(定义名称)列表

只需使用
mapatoms
迭代
(标记完成表)
返回的obarray即可。函数参数将为符号添加
字体锁定关键字
条目。类似这样(未经测试):

但请注意,(a)执行需要一段时间,(b)添加
标记中定义的每个符号,因此它将在
f90模式下锁定字体。这真的是你想要的吗?如果您的
标记
表是专门从(仅)Fortran文件创建的,那么这可能是有意义的;否则,可能不会

因为这可能需要一段时间,所以只能调用一次
foo
,而不是每次进入
f90模式时都调用一次。您可以在更新
标记
文件后再次执行此操作,以获取任何更改。如果(b)是一个考虑因素,那么您可以向函数arg添加一些过滤测试,以
mapautoms
,这样只有某些符号被字体锁定


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

可能吧,但您所说的“此类突出显示”是什么意思,尤其是“基于标记文件的内容”还不太清楚

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

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

但是,您可能是说您从
标记
文件中获得了名称
my_函数
,并且希望按定义对
标记
中列出的每个名称进行字体锁定(在
f90模式下
)。如果是这种情况,那么是的,您可以解析
标记
以获得已定义名称的列表,并将每个名称添加到
字体锁定关键字
(对于
f90模式
)。您可以使用
(标记完成表)
获取
标记中的标记(定义名称)列表

只需使用
mapatoms
迭代
(标记完成表)
返回的obarray即可。函数参数将为符号添加
字体锁定关键字
条目。类似这样(未经测试):

但请注意,(a)执行需要一段时间,(b)添加
标记中定义的每个符号,因此它将在
f90模式下锁定字体。这真的是你想要的吗?如果您的
标记
表是专门从(仅)Fortran文件创建的,那么这可能是有意义的;否则,可能不会

因为这可能需要一段时间,所以只能调用一次
foo
,而不是每次进入
f90模式时都调用一次。您可以在更新
标记
文件后再次执行此操作,以获取任何更改。如果(b)是一个考虑因素,那么您可以向函数arg添加一些过滤测试,以
mapautoms
,这样只有某些符号被字体锁定


无论如何,也许这会让你开始。是的,你完全理解我的问题。谢谢你的真知灼见。是的,你完全理解我的问题。感谢您的深刻见解。编辑以回答问题中@Drew的评论。编辑以回答问题中@Drew的评论。
(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)))))))