font-lock-add-keywords ne fonctionne pas
J'ai donc essayé d'ajouter une coloration syntaxique personnalisée pour les chiffres en utilisant font-lock-add-keywords
et regex.
J'ai regardé toutes les ressources d'Emacs pour ce faire, et bien que j'aie réussi à définir un visage, je n'ai font-lock-add-keywords
pas fonctionné pour une raison apparente.
J'ai même copié les exemples de différentes sources et j'ai directement essayé de les faire fonctionner sans succès apparent. Je n'arrive pas à comprendre ce qui ne va pas avec mon code. Je ne reçois aucune erreur, mais lorsque j'essaie d'évaluer le font-lock-add-keywords
(avec C-x C-e
), il s'imprime nil
dans le *Messages*
tampon.
Mettre à jour
J'ai suivi les conseils de Gilles et créé un mode mineur, réglé font-lock-add-keywords
sur ce mode mineur personnalisé, et utilisé une citation pour le visage. Bien que je puisse voir le mode mineur dans la ligne de mode et que je sache qu'il fonctionne, font-lock-add-keywords
cela ne semble toujours pas fonctionner. Voici mon code mis à jour:
(defgroup gio-group nil
"Group for customization"
:prefix "gio-")
(defface gio-highlight-numbers-face
'((t :inherit (default)
:foreground "#ffff00"))
"Face for numbers"
:group 'gio-group )
(define-minor-mode gio-minor-mode
"Minor mode for customizaion"
:init-value t
:lighter " GioMode"
:global t
:group 'gio-group)
(font-lock-add-keywords 'gio-minor-mode '(("[0-9]+" . 'gio-highlight-numbers-face)))
J'utilise GNU Emacs 26.3 (build 1, x86_64-w64-mingw32) sur Windows 10. Toute aide est très appréciée! Merci!
Réponses
Avec des recherches plus poussées et l'aide des commentaires de Gilles et Lindydancer, j'ai découvert que vous ne pouvez pas ajouter de mots-clés de verrouillage de police aux modes mineurs. Au lieu de cela, vous devez ajouter et supprimer les mots-clés du mode majeur lorsque le mode mineur est chargé et déchargé.
Voici le code de travail qui met en évidence les mots-clés en utilisant un mode mineur:
(defgroup gio-group nil
"Group for customization"
:prefix "gio-")
(defface gio-highlight-numbers-face
'((t :inherit (default)
:foreground "#ffff00"))
"Face for numbers"
:group 'gio-group )
(defvar gio-keywords '(("\\(\\b\\|[-]\\)\\([-]?\\([0-9]+\\)\\(\\.?[0-9]\\)*\\)\\b" . 'gio-highlight-numbers-face)) ;; Integers & Decimals
"Keywords for gio-minor-mode highlighting")
(define-minor-mode gio-minor-mode
"Minor mode for customization"
:init-value 1
:lighter " GioMode"
:group 'gio-group
(when (bound-and-true-p gio-minor-mode)
(font-lock-add-keywords nil gio-keywords)
(font-lock-fontify-buffer))
(when (not (bound-and-true-p gio-minor-mode))
(font-lock-remove-keywords nil gio-keywords)
(font-lock-fontify-buffer)))
(define-globalized-minor-mode gio-global-minor-mode gio-minor-mode gio-minor-mode :group 'gio-group)
(gio-global-minor-mode 1)
font-lock-add-keywordsajoute des mots-clés pour un mode majeur spécifique , tel que le mode Lisp ou le mode C ou le mode HTML. Depuis font-lock-mode
n'est pas un mode majeur (font-lock-add-keywords 'font-lock-mode …)
n'a jamais d'effet.
Si vous voulez vraiment des mots-clés de verrouillage de police qui s'appliquent dans tous les modes majeurs, vous devez définir un mode mineur. C'est ainsi que fonctionne le mode Whitespace . Beaucoup de mode Whitespace est plus compliqué que ce dont vous avez besoin. Vous pourriez peut-être ajouter un paramètre de «surbrillance des chiffres» au mode espace, mais il pourrait être plus facile de définir votre propre mode. La fonction de commodité est define-minor-modeutile, mais vous devez toujours ajouter et supprimer les mots-clés manuellement lorsque le mode est activé ou désactivé, en appelant (font-lock-add-keywords nil …)
et (font-lock-remove-keywords nil …)
. Voir Puis-je ajouter une surbrillance en mode mineur? pour les instructions.
De plus, il y a un piège dans le fonctionnement des visages: un nom de visage est un symbole qui n'est pas une variable. La (MATCHER . FACESPEC)
forme de font-lock-keywordsnécessite FACESPEC
d'être une expression dont la valeur spécifie un visage. custom-faces-highlight-numbers-face
ne fonctionne pas car ce n'est pas une expression valide car le symbole custom-faces-highlight-numbers-face
n'est pas lié. Il existe deux solutions à cela. La solution traditionnelle est de définir une variable portant le même nom que le visage; c'est ainsi que cela fonctionne pour les faces définies par le mode Verrouillage de la police, mais
Notez que dans le nouveau code, dans la grande majorité des cas, il n'est pas nécessaire de créer des variables qui spécifient les noms de visage. Il suffit d'utiliser directement les faces. Font-lock n'est pas un modèle à suivre dans ce domaine.
La solution recommandée mais lourde est de citer le symbole.
(font-lock-add-keywords 'gyo-highlight-numbers-mode '(("[0-9]+" . 'custom-faces-highlight-numbers-face)))