font-lock-add-keywords не работает

Aug 18 2020

Итак, я пытался добавить пользовательскую подсветку синтаксиса для цифр, использующих font-lock-add-keywordsи регулярное выражение.

Я просматривал все ресурсы Emacs, чтобы сделать это, и, хотя мне удалось успешно определить лицо, font-lock-add-keywordsон не работал по какой-либо очевидной причине.

Я даже скопировал примеры из разных источников и напрямую попытался заставить их работать без видимого успеха. Кажется, я не могу понять, что не так с моим кодом. Я не получаю никаких ошибок, но когда я пытаюсь оценить font-lock-add-keywordsC-x C-e), он печатается nilв *Messages*буфере.

Обновить

Я последовал совету Жиля и создал второстепенный режим, установил его font-lock-add-keywordsна этот пользовательский второстепенный режим и использовал цитату для лица. Хотя я вижу второстепенный режим в строке режима и знаю, что он работает, font-lock-add-keywordsпохоже, что он не работает. Вот мой обновленный код:

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

Я использую GNU Emacs 26.3 (сборка 1, x86_64-w64-mingw32) в Windows 10. Любая помощь приветствуется! Спасибо!

Ответы

2 Gyo Aug 19 2020 at 17:00

При дальнейшем исследовании и некоторой помощи комментариев от Gilles и Lindydancer я обнаружил, что вы не можете добавлять ключевые слова Font Lock в второстепенные режимы. Вместо этого вы должны добавлять и удалять ключевые слова в основном режиме, когда второстепенный режим загружается и выгружается.

Вот рабочий код, который выделяет ключевые слова в второстепенном режиме:

(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-keywordsдобавляет ключевые слова для определенного основного режима , такого как режим Lisp, режим C или режим HTML. Поскольку font-lock-modeэто не основной режим, (font-lock-add-keywords 'font-lock-mode …)никогда не имеет никакого эффекта.

Если вам действительно нужны ключевые слова блокировки шрифтов, которые применяются во всех основных режимах, вам необходимо определить второстепенный режим. Так работает режим Whitespace . Многие режимы пробелов сложнее, чем вам нужно. Возможно, вы могли бы добавить настройку «выделения цифр» в режим пробелов, но, возможно, будет проще определить свой собственный режим. Удобная функция define-minor-modeпомогает, но вам все равно нужно добавлять и удалять ключевые слова вручную, когда режим включен или выключен, вызывая (font-lock-add-keywords nil …)и (font-lock-remove-keywords nil …). См. Могу ли я добавить выделение в второстепенном режиме? для инструкций.

Кроме того, есть одна хитрость в том, как работают лица: имя лица - это символ, который не является переменной. (MATCHER . FACESPEC)Форма font-lock-keywordsтребует , FACESPECчтобы быть выражением, значение которого определяет лицо. custom-faces-highlight-numbers-faceне работает, потому что это недопустимое выражение, поскольку символ custom-faces-highlight-numbers-faceне привязан. Для этого есть два решения. Традиционное решение - определить переменную с тем же именем, что и лицо; вот как это работает для лиц, которые определяет режим Font Lock, но

Обратите внимание, что в новом коде в подавляющем большинстве случаев нет необходимости создавать переменные, определяющие имена лиц. Достаточно просто использовать лица напрямую. Блокировка шрифта не является шаблоном, которому следует следовать в этой области.

Рекомендуемое, но громоздкое решение - заключить символ в кавычки.

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