font-lock-add-keywords no funciona

Aug 18 2020

Así que he estado intentando agregar resaltado de sintaxis personalizado para dígitos usando font-lock-add-keywordsy regex.

He estado buscando en todos los recursos de Emacs para hacer esto, y aunque he podido definir con éxito una cara, font-lock-add-keywordsno ha funcionado por ninguna razón aparente.

Incluso he copiado los ejemplos de diferentes fuentes y he intentado directamente que funcionen sin éxito aparente. Parece que no puedo averiguar qué está mal con mi código. No recibo ningún error, pero cuando intento evaluar el font-lock-add-keywords(con C-x C-e), se imprime nilen el *Messages*búfer.

Actualizar

Seguí el consejo de Gilles y creé un modo menor, lo configuré font-lock-add-keywordsen ese modo menor personalizado y usé una cita para la cara. Si bien puedo ver el modo menor en la línea de modo y sé que está funcionando, font-lock-add-keywordstodavía parece que no funciona. Aquí está mi código actualizado:

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

Estoy ejecutando GNU Emacs 26.3 (compilación 1, x86_64-w64-mingw32) en Windows 10. ¡Apreciamos mucho cualquier ayuda! ¡Gracias!

Respuestas

2 Gyo Aug 19 2020 at 17:00

Con más investigación y algo de ayuda de los comentarios de Gilles y Lindydancer, descubrí que no se pueden agregar palabras clave Font Lock a modos menores. En su lugar, debe agregar y eliminar las palabras clave en el modo principal cuando se carga y descarga el modo menor.

Aquí está el código de trabajo que resalta las palabras clave usando un modo menor:

(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-keywordsagrega palabras clave para un modo principal específico , como el modo Lisp o el modo C o el modo HTML. Dado font-lock-modeque no es un modo mayor, (font-lock-add-keywords 'font-lock-mode …)nunca tiene ningún efecto.

Si realmente desea palabras clave de bloqueo de fuente que se apliquen en todos los modos principales, debe definir un modo menor. Así es como funciona el modo de espacio en blanco . Muchos modos de espacios en blanco son más complicados de lo que necesitas. Quizás podría agregar una configuración de "resaltado de dígitos" al modo de espacios en blanco, pero podría ser más fácil definir su propio modo. La función de conveniencia define-minor-modeayuda, pero aún debe agregar y eliminar las palabras clave manualmente cuando el modo está encendido o apagado, llamando a (font-lock-add-keywords nil …)y (font-lock-remove-keywords nil …). Consulte ¿Puedo agregar resaltado en un modo menor? para obtener instrucciones.

Además, hay un problema en el funcionamiento de las caras: el nombre de una cara es un símbolo que no es una variable. La (MATCHER . FACESPEC)forma de font-lock-keywordsrequiere FACESPECser una expresión cuyo valor especifica una cara. custom-faces-highlight-numbers-faceno funciona porque no es una expresión válida ya que el símbolo custom-faces-highlight-numbers-faceno está vinculado. Hay dos soluciones para esto. La solución tradicional es definir una variable con el mismo nombre que el rostro; así es como funciona para las caras que define el modo Font Lock, pero

Tenga en cuenta que en el código nuevo, en la gran mayoría de los casos, no es necesario crear variables que especifiquen nombres de caras. Basta con usar caras directamente. Font-lock no es una plantilla a seguir en esta área.

La solución recomendada pero engorrosa es citar el símbolo.

(font-lock-add-keywords 'gyo-highlight-numbers-mode '(("[0-9]+" . 'custom-faces-highlight-numbers-face)))