0

我刚刚开始使用 emacs 模式。我制作了一个派生模式(from 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)))

当我第一次打开包含此类文本的文件时,它会被适当地着色;但是如果我添加一个额外的=,或者创建一个新行=============,它们就会变成正常的文本颜色。

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

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

4

2 回答 2

2

您面临的问题是 font-lock 在处理多行关键字时需要特别小心。

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

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

有关更多信息,请参阅EmacsLisp 手册的Multiline Font Lock Constructs部分。

于 2013-10-27T23:26:00.013 回答
0

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

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

(FWIW:您不需要变量font-lock-heading-face1,至少对于显示的代码不需要 - 只需使用面部符号。并考虑仅使用 定义面部defface。)

于 2013-10-27T22:14:01.787 回答