font-lock-add-keywords non funziona
Quindi ho provato ad aggiungere l'evidenziazione della sintassi personalizzata per le cifre usando font-lock-add-keywords
e regex.
Ho esaminato tutte le risorse di Emacs per farlo e, sebbene sia stato in grado di definire con successo un volto, font-lock-add-keywords
non ha funzionato per nessuna ragione apparente.
Ho persino copiato gli esempi da diverse fonti e ho cercato direttamente di farli funzionare senza apparente successo. Non riesco a capire cosa c'è che non va nel mio codice. Non ricevo alcun errore, ma quando provo a valutare il font-lock-add-keywords
(con C-x C-e
), viene stampato nil
nel *Messages*
buffer.
Aggiornare
Ho seguito il consiglio di Gilles e ho creato una modalità minore, impostata font-lock-add-keywords
su quella modalità minore personalizzata e ho usato una citazione per il viso. Anche se posso vedere la modalità minore nella riga della modalità e sapere che funziona, font-lock-add-keywords
sembra ancora non funzionare. Ecco il mio codice aggiornato:
(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)))
Uso GNU Emacs 26.3 (build 1, x86_64-w64-mingw32) su Windows 10. Qualsiasi aiuto è molto apprezzato! Grazie!
Risposte
Con ulteriori ricerche e un po 'di aiuto dai commenti di Gilles e Lindydancer, ho scoperto che non è possibile aggiungere parole chiave Font Lock alle modalità minori. Invece, è necessario aggiungere e rimuovere le parole chiave nella modalità principale quando la modalità secondaria viene caricata e scaricata.
Ecco il codice funzionante che evidenzia le parole chiave utilizzando una modalità minore:
(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-keywordsaggiunge parole chiave per una modalità principale specifica , come la modalità Lisp o la modalità C o la modalità HTML. Poiché font-lock-mode
non è una modalità principale, (font-lock-add-keywords 'font-lock-mode …)
non ha mai alcun effetto.
Se vuoi davvero parole chiave per il blocco dei caratteri che si applicano in ogni modalità principale, devi definire una modalità secondaria. È così che funziona la modalità Whitespace . Molte modalità Whitespace sono più complicate di quelle di cui hai bisogno. Potresti forse aggiungere un'impostazione di "evidenziazione delle cifre" alla modalità spazi, ma potrebbe essere più semplice definire la tua modalità. La funzione convenienza define-minor-modeaiuta, ma è comunque necessario aggiungere e rimuovere le parole chiave manualmente quando la modalità è attivata o disattivata, chiamando (font-lock-add-keywords nil …)
e (font-lock-remove-keywords nil …)
. Vedi Posso aggiungere l'evidenziazione in una modalità minore? per istruzioni.
Inoltre, c'è un trucco nel modo in cui funzionano i volti: il nome di un viso è un simbolo che non è una variabile. La (MATCHER . FACESPEC)
forma di font-lock-keywordsrichiede FACESPEC
di essere un'espressione il cui valore specifica una faccia. custom-faces-highlight-numbers-face
non funziona perché non è un'espressione valida poiché il simbolo custom-faces-highlight-numbers-face
non è vincolato. Ci sono due soluzioni a questo. La soluzione tradizionale è definire una variabile con lo stesso nome della faccia; è così che funziona per i volti definiti dalla modalità Blocco caratteri, ma
Si noti che nel nuovo codice, nella stragrande maggioranza dei casi, non è necessario creare variabili che specificano i nomi dei volti. Basta usare direttamente i volti. Il blocco dei caratteri non è un modello da seguire in quest'area.
La soluzione consigliata ma ingombrante è citare il simbolo.
(font-lock-add-keywords 'gyo-highlight-numbers-mode '(("[0-9]+" . 'custom-faces-highlight-numbers-face)))