Yazı tipi kilidi varsayılanları olan özel bir yüzü nasıl belirleyebilirim?


11

Varolan yüzleri kullanarak yazı tipi kilit anahtar sözcükleri tanımlarsam, 'foo' dizesini vurgulayabilirim.

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

Bu doğru bir şekilde vurgular:

foo doğru vurgulanmış

Ancak, kendi yüzümü tanımlarsam:

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

Vurgulama uygulanmaz:

vurgulama yok

font-lock-defaultsKendimi tanımladığım bir yüzle nasıl kullanabilirim ?

Yanıtlar:


8

C-hvDeğerin değerine bir bakın font-lock-type-facesadece semboldür font-lock-type-face. Şimdi C-hvdeğerine bakın my-mode-foo-face. Oh hayır! yapamazsın! Bu bir değişken değil!

Yüzünüze erişmek için bir değişkene ihtiyacınız var. Bildirmek foo-faceyüzü bildirmiyor foo-facedeğişkeni.

(defvar my-mode-foo-face 'my-mode-foo-face)Yüz tanımından sonra ekleyin ve ardından yazı tipi kilidi yüzünüze my-mode-foo-faceerişmek için var'ınızı kullanabilir my-mode-foo-face. Kafa karıştırıcı biliyorum.


Düzenleme: font-lock.el ne diyor dayalı daha iyi bir çözüm var gibi görünüyor:

;; 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.

Bu Wilfred'in anahtar kelimelerdeki yüzü iki kez tırnak içine alma çözümü olabilir.


3
Aha, bu yüzden bir değişken bekliyor. (cons "foo" ''my-mode-foo-face))Ayrıca işe yarıyor, ama hangisinin deyimsel olduğundan emin değilim.
Wilfred Hughes

1
Hmm, cevabım okuduğum şeye bağlı olarak sorunun antik çözümü gibi görünüyorfont-lock.el
Jordon Biondo

3
Aslında değerlendireceği bir ifade bekliyor. Böylece oraya biraz mantık da ekleyebilirsiniz.
Dmitry
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.