font-lock-add-keywords не работает
Итак, я пытался добавить пользовательскую подсветку синтаксиса для цифр, использующих font-lock-add-keywords
и регулярное выражение.
Я просматривал все ресурсы Emacs, чтобы сделать это, и, хотя мне удалось успешно определить лицо, font-lock-add-keywords
он не работал по какой-либо очевидной причине.
Я даже скопировал примеры из разных источников и напрямую попытался заставить их работать без видимого успеха. Кажется, я не могу понять, что не так с моим кодом. Я не получаю никаких ошибок, но когда я пытаюсь оценить font-lock-add-keywords
(с C-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. Любая помощь приветствуется! Спасибо!
Ответы
При дальнейшем исследовании и некоторой помощи комментариев от 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)
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)))