Comment spécifier un visage personnalisé avec des valeurs par défaut de verrouillage de police?

11

Si je définis des mots clés de verrouillage de police à l'aide de faces existantes, je peux mettre en surbrillance la chaîne «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)))

Cela met en évidence correctement:

foo bien mis en évidence

Cependant, si je définis mon propre visage:

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

Aucun surlignage n'est appliqué:

pas de mise en évidence

Comment utiliser font-lock-defaultsavec un visage que je me suis défini?

Wilfred Hughes
la source

Réponses:

8

Jetez un oeil à la C-hvvaleur de font-lock-type-facela valeur est juste le symbole font-lock-type-face. Regardez maintenant la C-hvvaleur de my-mode-foo-face. Oh non! tu ne peux pas! Ce n'est pas une variable!

Vous avez besoin d'une variable pour accéder à votre visage. La déclaration de la foo-faceface ne déclare pas la foo-facevariable.

Ajoutez (defvar my-mode-foo-face 'my-mode-foo-face)après la définition du visage, puis le verrouillage de police peut utiliser votre my-mode-foo-facevar pour accéder au my-mode-foo-facevisage. Déroutant je sais.


Edit: il semble y avoir une meilleure solution basée sur ce que dit 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.

C'est peut-être la solution de Wilfred de citer deux fois le visage dans les mots clés.

Jordon Biondo
la source
3
Aha, donc il attend une variable. (cons "foo" ''my-mode-foo-face))fonctionne également, mais je ne sais pas ce qui est idiomatique.
Wilfred Hughes
1
Hmm, ma réponse semble être la solution désuète du problème en fonction de ce que je lisfont-lock.el
Jordon Biondo
3
Il attend une expression, en fait, qu'il évaluera. Vous pouvez donc également y mettre un peu de logique.
Dmitry