字体锁定关键字中的progn表单是如何工作的



以下代码将通过将progn表单传递给字体锁定关键字,直观地用"HW"替换"hello-world"。

(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世界元素似乎是这样的形式:

(MATCHER HIGHLIGHT ...)

这意味着(0 ...)是HIGHLIGHT,医生说

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)))))

它确实有效,但您的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 ...)在这种情况下,将设置所有列出的文本属性,而不是仅CCD_ 9。"

这里,FACENAME表达式(progn)的计算结果为nil,因此没有设置属性或面,这是put-text-property引起的唯一效果。

("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本身不同时使用列表。

相关内容

  • 没有找到相关文章

最新更新