Come posso specificare un volto personalizzato con font-lock-default?


11

Se definisco parole chiave per il blocco dei caratteri utilizzando facce esistenti, posso evidenziare la stringa "pippo".

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

Questo evidenzia correttamente:

foo evidenziato correttamente

Tuttavia, se definisco la mia faccia:

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

Non viene applicato l'evidenziazione:

nessuna evidenziazione

Come posso usare font-lock-defaultsun viso che mi sono definito?

Risposte:


8

Dai un'occhiata al C-hvvalore del font-lock-type-facevalore è solo il simbolo font-lock-type-face. Ora guarda il C-hvvalore di my-mode-foo-face. Oh no! non puoi! Non è una variabile!

Hai bisogno di una variabile per accedere al tuo viso. Dichiarare la foo-facefaccia non dichiara la foo-facevariabile.

Aggiungi (defvar my-mode-foo-face 'my-mode-foo-face)dopo la definizione della faccia e quindi il blocco dei caratteri può usare my-mode-foo-facevar per accedere alla my-mode-foo-facefaccia. Confuso lo so.


Modifica: sembra esserci una soluzione migliore in base a ciò che dice 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.

Questa potrebbe essere la soluzione di Wilfred per la doppia citazione del volto nelle parole chiave.


3
Ah, quindi si aspetta una variabile. (cons "foo" ''my-mode-foo-face))funziona anche, ma non sono sicuro di quale sia idiomatico.
Wilfred Hughes,

1
Hmm, la mia risposta sembra essere la soluzione antiquata per il problema basata su quello che sto leggendofont-lock.el
Jordon Biondo,

3
Si aspetta un'espressione, in realtà, che valuterà. Quindi puoi anche mettere un po 'di logica lì dentro.
Dmitry,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.