font-lock-defaultsでカスタムフェイスを指定するにはどうすればよいですか?


11

既存のフェイスを使用してフォントロックキーワードを定義すると、文字列「foo」を強調表示できます。

(defconst my-mode-font-lock-keywords
  (list
   (cons "foo" 'font-lock-type-face)))

(define-derived-mode my-mode fundamental-mode "My mode"
  "A demo mode."
  (set (make-local-variable 'font-lock-defaults) '(my-mode-font-lock-keywords)))

これは正しく強調表示されます:

fooは正しく強調表示されました

ただし、自分の顔を定義した場合:

(defface my-mode-foo-face
  '((t :inherit font-lock-preprocessor-face))
  "Face for highlighting 'foo'.")

(defconst my-mode-font-lock-keywords
  (list
   (cons "foo" 'my-mode-foo-face)))

(define-derived-mode my-mode fundamental-mode "My mode"
  "A demo mode."
  (set (make-local-variable 'font-lock-defaults) '(my-mode-font-lock-keywords)))

ハイライトは適用されません:

ハイライトなし

font-lock-defaults自分で定義した顔でどのように使用できますか?

回答:


8

値が単なる記号であるC-hv値を見てみましょう。次に、の値を見てください。大野!できません!変数ではありません!font-lock-type-facefont-lock-type-faceC-hvmy-mode-foo-face

顔にアクセスするには変数が必要です。foo-face面を宣言しても、foo-face変数は宣言されません。

(defvar my-mode-foo-face 'my-mode-foo-face)顔の定義の後に追加すると、font-lockはmy-mode-foo-facevarを使用してmy-mode-foo-face顔にアクセスできます。混乱しています。


編集:font-lock.elが言うことに基づいてより良い解決策があるようです:

;; Originally these variable values were face names such as `bold' etc.
;; Now we create our own faces, but we keep these variables for compatibility
;; and they give users another mechanism for changing face appearance.
;; We now allow a FACENAME in `font-lock-keywords' to be any expression that
;; returns a face.  So the easiest thing is to continue using these variables,
;; rather than sometimes evalling FACENAME and sometimes not.  sm.

;; Note that in new code, in the vast majority of cases there is no
;; need to create variables that specify face names.  Simply using
;; faces directly is enough.  Font-lock is not a template to be
;; followed in this area.

それはキーワードで顔を二重引用するウィルフレッドの解決策かもしれません。


3
ああ、それで変数を期待しています。(cons "foo" ''my-mode-foo-face))も機能しますが、どちらが慣用的であるかはわかりません。
Wilfred Hughes

1
うーん、私の答えは、私が読んでいることに基づいた問題の古い解決策のようですfont-lock.el
Jordon Biondo 2014年

3
実際には、式が評価されることを期待しています。したがって、そこにロジックを配置することもできます。
ドミトリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.