0

次のコードは、prog フォームをフォント ロック キーワードに渡すことで、「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 であり、FACENAME であると推測し(progn ...)ました。しかし(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

の 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

于 2013-09-02T14:30:56.980 に答える
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 に答える