emacs major-mode:font-lock仅在首次加载文件时发生

时间:2013-10-27 21:01:05

标签: emacs syntax fonts customization mode

我刚开始玩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)))

当我第一次打开具有此类文本的文件时,它会被适当地着色;但是,如果我添加额外的=,或创建一个新的=============行,则会转为普通文字颜色。

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

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

2 个答案:

答案 0 :(得分:2)

您遇到的问题是在处理多行关键字时,字体锁需要特别小心。

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

如果您的特殊font-lock-extend-region-functions行是该区域的第一行或该区域后的第一行,则快速解决方法是向={5,}.*添加一个会延长重新点亮区域的挂钩。这不是唯一(也可能不是最佳)的方式,但它应该有效。

有关详情,请参阅EmacsLisp手册的Multiline Font Lock Constructs部分。

答案 1 :(得分:0)

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

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

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