Emacs 主要模式:字体锁定仅在首次加载文件时发生



我刚刚开始使用 emacs 模式。 我制作了一个派生模式(来自text-mode),它针对不同的情况进行了简单的颜色修改。 例如,所有等号 ( = ) 行上方的文本变为洋红色,这是使用代码完成的:

(make-face 'heading-face1)
(set-face-foreground 'heading-face1 "brightmagenta")
(set-face-attribute 'heading-face1 nil :weight 'ultra-bold)                                                                                                                                                           
(setq font-lock-heading-face1 'heading-face1)
(font-lock-add-keywords nil '(("\(.*n=\{5,\}.*\)"
                           1 font-lock-heading-face1 prepend)))

当我第一次打开一个有这种文本的文件时,它的颜色是适当的;但是如果我添加一个额外的=,或者创建一个新的=============行,它们会变成正常的文本颜色。

其他字体锁可以动态工作。 例如,数字立即使用不同的颜色...

什么会导致模式动态匹配与首次打开文件时不同?

您面临的问题是字体锁定在处理多行关键字时需要特别小心。

当您第一次打开文件时,font-lock 会在相当大的块(~500 字节 IIRC)中突出显示,但是在以某种方式更改缓冲区后,默认情况下,出于优化原因,字体锁定只会逐行重新突出显示它,这意味着当它考虑您的标题行时,其工作区甚至不会包含下一行来执行匹配。

快速解决方法是向font-lock-extend-region-functions添加一个钩子,如果特殊={5,}.*行是区域的第一行或区域之后的第一行,则会扩展重新突出显示的区域。这不是唯一(也可能不是最优化的)方法,但它应该有效。

有关更多信息,请参阅 EmacsLisp 手册的多行字体锁定结构部分。

如果有多个模式匹配,字体锁定关键字的顺序很重要。尝试使用 t 而不是 prepend

至于为什么它在首次打开文件时有效:也许当您第一次打开文件时,它首先被正常字体锁定,然后添加新规则。

(FWIW:你不需要变量font-lock-heading-face1,至少不需要显示的代码 - 只需使用人脸符号。 并考虑只用defface来定义脸。

最新更新