0

以下代码将通过将 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,医生说

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

2 回答 2

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

于 2013-09-02T10:08:06.763 回答
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),这些等价可能导致歧义,这就是为什么在这种情况下你会出错。

所以 form(MATCHER . HIGHLIGHT)(match . FACENAME)such 应该只在它们本身不是列表HIGHLIGHT时使用。FACENAME

于 2013-09-02T14:30:56.980 回答