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

How to use emacs/elisp to highlight parts of font-locked source code

我有一些日志文件,其中包含 C++、C、Java 和 C# 源代码文件的目录路径和文件名(和行号)。我写了一个正则表达式来搜索这些文件名和行号并打开源代码文件并将插入点定位在指定的行号处(有点像与编译命令一起使用时的 next-error 函数)。

给定一个多次出现在日志文件中的文件名,我想在源代码文件显示中添加突出显示(并有选择地删除突出显示)window/buffer。

我可以使用 add-text-properties、remove-text-properties 和 add-face-text-属性(remove-face-text-属性 在哪里? ) 如果没有字体锁定(关键字颜色编码)。如果打开字体锁定,这些功能将不起作用!

如果打开了字体锁定,我该如何操作?我看到增量搜索功能可以做到这一点,因此可以添加和删除突出显示而不会弄乱字体锁定编码。

谢谢 齐格弗里德

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

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

任何使用 text 属性 face 的突出显示都被 font-lock 突出显示所否决 -- font-lock 想要获胜。在许多情况下,您仍然可以突出显示文本,但字体锁定迟早会在重新设置缓冲区时擦除突出显示。

适用于使用覆盖的突出显示——字体锁定对覆盖没有影响。所以一个答案是只使用覆盖。但是,如果这对您的用例不起作用(使用叠加层有一些缺点),仍然有希望。

为了防止 font-lock 干扰其他高亮,典型的 Emacs 做法是欺骗 font-lock 以为它是 font-lock 高亮,即使它不涉及 font-lock-keywords

但这有这样的效果,当font-lock-mode关闭时,这样的突出显示也会关闭。这是好事还是坏事取决于您的用例。

在原始 Emacs 中,您别无选择。字体锁定无法识别突出显示,这会否决它,或者它被识别为“它自己的一个”,在这种情况下,当字体锁定突出显示关闭时它也会关闭。

如果你在font-lock-mode关闭时不需要你的特殊高亮,那么你可以只使用文本属性 font-lock-face而不是 属性 face.

如果您使用库 highlight.el 来实现突出显示,那么您只需将选项 hlt-face-prop 保留为默认值 [=14] =]. (值font-lock-face表示高亮由font-lock控制。值face表示font-lock不识别高亮。)

对于选项值为 face 的情况,如果您还使用库 font-lock+.el 则不会受到 font-lock 的干扰——突出显示与 font-lock 无关。 库 font-lock+.elhighlight.el 自动加载,如果它在您的 load-path 中。它可以防止字体锁定删除您使用此处定义的命令应用的任何突出显示面属性。

有关详细信息,请参阅 Highlight Library