【问题标题】:emacs major-mode: font-lock only occurs when first loading fileemacs 主要模式:字体锁定仅在首次加载文件时发生
【发布时间】:2013-10-27 21:01:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: emacs syntax fonts customization mode


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢@immerrr,这很有意义——而且似乎是解释。我对 lisp 完全不熟悉,并且在破译多行结构的文档时遇到了麻烦。有没有机会举个例子?
    • @zhermes,如果你留在 Emacs,不熟悉 Lisp 只是时间问题 :) 同时,你可以试试这个例子:stackoverflow.com/a/15239704/944617
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      相关资源
      最近更新 更多