通过将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)))))
答案 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)
等
只应在HIGHLIGHT
和FACENAME
不是自己的情况下使用
列表。