3

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

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

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

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

谢谢齐格弗里德

4

2 回答 2

2

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

(let ((ol (make-overlay BEG END)))
  (overlay-put ol 'face 'bold))
于 2017-05-04T18:38:31.037 回答
1

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

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

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

但这具有在关闭时关闭此类突出显示的效果font-lock-mode。这是好事还是坏事取决于您的用例。

在 vanilla Emacs 中,您对此别无选择。要么字体锁定无法识别突出显示,它会否决它,要么它被识别为“它自己的”,在这种情况下,当字体锁定突出显示关闭时,它会被关闭。

font-lock-mode如果您在关闭时不需要特殊突出显示,那么您可以只使用 text propertyfont-lock-face而不是 property face

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

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

有关详细信息,请参阅突出显示库

于 2017-05-04T23:07:14.830 回答