font-lock-add-keywords non funziona

Aug 18 2020

Quindi ho provato ad aggiungere l'evidenziazione della sintassi personalizzata per le cifre usando font-lock-add-keywordse 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-keywordsnon 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 nilnel *Messages*buffer.

Aggiornare

Ho seguito il consiglio di Gilles e ho creato una modalità minore, impostata font-lock-add-keywordssu 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-keywordssembra 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

2 Gyo Aug 19 2020 at 17:00

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)
Gilles'SO-stopbeingevil' Aug 19 2020 at 05:18

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-modenon è 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 FACESPECdi essere un'espressione il cui valore specifica una faccia. custom-faces-highlight-numbers-facenon funziona perché non è un'espressione valida poiché il simbolo custom-faces-highlight-numbers-facenon è 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)))