¿Cómo especifico una cara personalizada con font-lock-defaults?

11

Si defino palabras clave de bloqueo de fuente usando caras existentes, puedo resaltar la cadena '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)))

Esto destaca correctamente:

foo resaltado correctamente

Sin embargo, si defino mi propia cara:

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

No se aplica resaltado:

sin resaltar

¿Cómo puedo usar font-lock-defaultscon una cara que me he definido?

Wilfred Hughes
fuente

Respuestas:

8

Observe que el C-hvvalor del font-lock-type-facevalor es solo el símbolo font-lock-type-face. Ahora mira el C-hvvalor de my-mode-foo-face. ¡Oh no! no puedes! ¡No es una variable!

Necesitas una variable para acceder a tu cara. Declarar la foo-facecara no declara la foo-facevariable.

Agregue (defvar my-mode-foo-face 'my-mode-foo-face)después de la definición de la cara y luego font-lock puede usar su my-mode-foo-facevar para acceder a la my-mode-foo-facecara. Confuso lo sé.


Editar: parece haber una mejor solución basada en lo que 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.

Esa puede ser la solución de Wilfred de doble cita de la cara en las palabras clave.

Jordon Biondo
fuente
3
Ajá, entonces está esperando una variable. (cons "foo" ''my-mode-foo-face))También funciona, pero no estoy seguro de cuál es idiomático.
Wilfred Hughes
1
Hmm, mi respuesta parece ser la solución anticuada para el problema basado en lo que estoy leyendofont-lock.el
Jordon Biondo
3
Está esperando una expresión, en realidad, que evaluará. Entonces también puedes poner algo de lógica allí.
Dmitry