以下代码将通过将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)
等应仅在HIGHLIGHT
和FACENAME
本身不同时使用列表。