我刚刚开始使用 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
来定义脸。