font-lock-keywords中的预测形式如何工作?

时间:2013-09-02 09:50:13

标签: emacs elisp syntax-highlighting font-lock

通过将progn表单传递给字体锁定关键字,以下代码将在视觉上将“hello world”替换为“HW”。

(font-lock-add-keywords
 nil '(("\\(hello world\\)"
        (0 (progn (put-text-property (match-beginning 1) (match-end 1)
                                     'display "HW")
                  nil)))))

我查看C-h v font-lock-keywords以查看这是否是字体锁定的文档功能。 hello world元素似乎是这种形式:

(MATCHER HIGHLIGHT ...)

这意味着(0 ...)突出显示,文档说

HIGHLIGHT should be either MATCH-HIGHLIGHT or MATCH-ANCHORED.

MATCH-HIGHLIGHT should be of the form:

 (SUBEXP FACENAME [OVERRIDE [LAXMATCH]])

所以我猜测0是SUBEXP而(progn ...)是FACENAME。但是,如果(progn ..)是有效的FACENAME,则以下代码可以正常工作,但不起作用。

;;  (MATCHER . FACENAME)
(font-lock-add-keywords
 nil '(("goodbye lenin"
        . (progn (put-text-property (match-beginning 1) (match-end 1)
                                    'display "GL")
                 nil))))

这让我想到了第一个代码如何工作以及它是否依赖于未记录的功能的问题。


更新

附注:更简单的视觉替换方式,没有字体锁定错误

(font-lock-add-keywords
 nil '(("my llama"
        (0 (progn (put-text-property (match-beginning 0) (match-end 0)
                                     'display "ML")
                  nil)))))

2 个答案:

答案 0 :(得分:1)

确实有效 - 但您的MATCHER不正确 - 不会存储匹配结果。例如,这不起作用:

(font-lock-add-keywords
 nil '(("goodbye lenin"
        (0 (progn (put-text-property (match-beginning 1) (match-end 1)
                                    'display "GL")
                  nil)))))

虽然这样做:

(font-lock-add-keywords
 nil '(("\\(goodbye lenin\\)"
        . (progn (put-text-property (match-beginning 1) (match-end 1)
                                    'display "GL")
                 nil))))

文档说:“FACENAME是一个表达式,其值是要使用的面部名称。 FACENAME可以评估属性列表而不是面部 形式(face FACE PROP1 VAL1 PROP2 VAL2 ...) 在这种情况下,将设置所有列出的文本属性而不是 只是FACE。“

此处,FACENAME表达式(progn)的计算结果为nil,因此未设置任何属性或面 - 这是由put-text-property引起的唯一影响。

答案 1 :(得分:1)

一  ("goodbye lenin" . (progn (put-text-property (match-beginning 1) (match-end 1) 'display "GL") nil))的问题在于它 只是另一种写作方式:("goodbye lenin" progn (put-text-property (match-beginning 1) (match-end 1) 'display "GL") nil),以及这些 等价可能导致含糊不清,这就是为什么在这种情况下你得到的 错误。

表格(MATCHER . HIGHLIGHT)(match . FACENAME)等 只应在HIGHLIGHTFACENAME不是自己的情况下使用 列表。