Обновление ключевых слов с блокировкой шрифта в emacs без перезагрузки основного режима
-
07-07-2019 - |
Вопрос
Я делаю небольшую модификацию в SLIME, чтобы я мог получить все загруженные в данный момент символы из Lisp, проанализировать их и настроить блокировку шрифтов.
Мне удалось выполнить все эти шаги, но у меня возникла небольшая проблема - при изменении списка ключевых слов в font-lock буфер не обновляется, пока вы не перезапустите основной lisp-режим.Я не хочу перезапускать lisp-mode каждый раз, когда я обновляю ключевые слова, потому что у меня есть несколько перехватов в lisp-mode, которые я хочу запускать только при первой загрузке файла.
Есть ли другой способ обновить font-lock, чтобы он считывал все новые ключевые слова и соответствующим образом заполнял буфер?Выключение блокировки шрифтов и использование font-lock-fontify-buffer
не делает нужного эффекта.
UPD:Добавлена награда - вопрос все еще остается открытым.Мне нужен способ перезагрузить ключевое слово font-lock без перезагрузки основного режима.
Решение
Хорошо, как насчет этого вместо этого:
(defun my-font-lock-restart ()
(interactive)
(setq font-lock-mode-major-mode nil)
(font-lock-fontify-buffer))
Другие советы
Запуск основного режима - это не то, что заставляет блокировку шрифтов делать свое дело.Я не очень хорошо знаком с внутренностями SLIME или lisp-mode, но простая установка переменной должна заставить ее работать.Переключение режима блокировки шрифта приведет к тому, что функция блокировки шрифта начнет переконфигурировать с учетом новых ключевых слов, как и должно быть font-lock-fontify-buffer
.
В основном я взламываю cperl-mode, и это простой вопрос cperl-init-faces
(который устанавливает внутренние переменные font-lock) и перезапуск font-lock.lisp-режим не должен сильно отличаться, за исключением того, что не требуется вызов cperl-init-faces
;)
Редактировать:некоторые эксперименты с lisp-interaction-mode показывают, что даже перезапуск режима блокировки шрифтов не является строго необходимым.Достаточно просто изменить ключевые слова с блокировкой шрифта, если вы каким-то образом повторно активируете шрифт.(Редактирование текста, блокировка шрифта, буферизация шрифтов и т.д.)
Вы могли бы временно очистить переменную mode hook и перезапустить ее:
(defun my-restart-lisp-mode ()
(interactive)
(let ((lisp-mode-hook nil))
(normal-mode)))