如何使用emacs/elisp来突出显示字体锁定的源代码部分

3
我有一些包含C++、C、Java和C#源代码文件的目录路径和文件名(及行号)的日志文件。我编写了一个正则表达式来搜索这些文件名和行号,并打开源代码文件并将插入点定位到指定的行号(有点类似于在用编译命令时使用下一个错误函数)。
如果给定的文件名在日志文件中出现多次,我希望能够向源代码文件显示窗口/缓冲区添加高亮显示(并有选择性地删除高亮显示)。
如果没有字体锁定(关键字颜色编码),我可以使用add-text-properties、remove-text-properties和add-face-text-property(其中remove-face-text-property在哪里?)等函数来实现。但是如果字体锁定被打开了,这些函数就不起作用了!
如果打开了字体锁定,我该如何实现呢?我发现增量搜索功能可以做到这一点,因此可以在不干扰字体锁定编码的情况下添加和删除高亮显示。
谢谢,Siegfried
2个回答

2

使用叠加层而不是文本属性。例如,要在BEG和END之间用bold突出显示文本,请执行以下操作:

(let ((ol (make-overlay BEG END)))
  (overlay-put ol 'face 'bold))

1
任何使用text propertyface进行高亮的内容都会被字体锁定高亮覆盖 - 字体锁定想要胜出。在许多情况下,您仍然可以突出显示文本,但是迟早字体锁定会在重新格式化缓冲区时擦除该突出显示。
这不适用于使用叠加层进行突出显示的内容 - 字体锁定对叠加层没有影响。因此,一个解决方案就是只使用叠加层。但是,如果这对您的用例不起作用(使用叠加层存在一些缺点),仍有希望。
为了防止字体锁定干扰其他突出显示,Emacs的典型方法是欺骗字体锁定,使其认为它正在进行字体锁定突出显示,即使它不涉及font-lock-keywords
但是这会导致当font-lock-mode关闭时,这种突出显示效果被关闭。这是好事还是坏事取决于您的用例。
在原始的Emacs中,您无法选择。要么突出显示未被字体锁定识别并被覆盖,要么被识别为“自己的一部分”,在关闭字体锁定突出显示时将其关闭。
如果您在关闭font-lock-mode时不需要特殊的突出显示,则可以使用文本属性font-lock-face代替属性face。如果您使用库highlight.el来实现突出显示,则可以通过将选项hlt-face-prop保留为其默认值font-lock-face来完成。 (值font-lock-face表示突出显示由字体锁定控制。值face表示font-lock不识别突出显示。)

如果选项的值是face,并且您还使用库font-lock+.el,则字体锁定不会有干扰-高亮显示与字体锁定无关。如果在load-path中,库font-lock+.el会被highlight.el自动加载。它可以防止字体锁定删除您使用此处定义的命令应用的任何高亮显示面属性。

有关更多信息,请参见高亮显示库


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接