Bagaimana cara menentukan wajah khusus dengan font-lock-defaults?

11

Jika saya menentukan kata kunci kunci font menggunakan wajah yang ada, saya dapat menyorot string '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)))

Ini menyoroti dengan benar:

foo disorot dengan benar

Namun, jika saya mendefinisikan wajah saya sendiri:

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

Tidak ada penyorotan yang diterapkan:

tidak ada penyorotan

Bagaimana saya bisa menggunakan font-lock-defaultswajah yang sudah saya definisikan sendiri?

Wilfred Hughes
sumber

Jawaban:

8

Lihatlah C-hvnilai font-lock-type-facenilainya hanya simbol font-lock-type-face. Sekarang lihat C-hvnilai my-mode-foo-face. Oh tidak! kamu tidak bisa! Itu bukan variabel!

Anda memerlukan variabel untuk mengakses wajah Anda. Mendeklarasikan foo-facewajah tidak mendeklarasikan foo-facevariabel.

Tambahkan (defvar my-mode-foo-face 'my-mode-foo-face)setelah definisi wajah dan kemudian font-lock dapat menggunakan my-mode-foo-facevar Anda untuk mengakses my-mode-foo-facewajah. Bingung saya tahu.


Sunting: tampaknya ada solusi yang lebih baik berdasarkan apa yang dikatakan 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.

Itu mungkin solusi Wilfred untuk mengutip ganda wajah pada kata kunci.

Jordon Biondo
sumber
3
Aha, jadi itu mengharapkan variabel. (cons "foo" ''my-mode-foo-face))juga berfungsi, tapi saya tidak yakin mana yang idiomatis.
Wilfred Hughes
1
Hmm, jawaban saya tampaknya menjadi solusi kuno untuk masalah berdasarkan apa yang saya bacafont-lock.el
Jordon Biondo
3
Ini sebenarnya mengharapkan ekspresi, yang akan dievaluasi. Jadi Anda juga dapat menaruh beberapa logika di sana.
Dmitry