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?

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.