Обновление ключевых слов font-lock в emacs без перезагрузки основного режима - PullRequest
8 голосов
/ 16 сентября 2009

Я делаю небольшую модификацию SLIME, чтобы я мог получить все загруженные в данный момент символы из Lisp, проанализировать их и заставить шрифтовую блокировку узнавать их.

Мне удалось выполнить все эти шаги, но у меня возникла небольшая проблема - когда список ключевых слов изменяется в font-lock, буфер не обновляется, пока вы не перезапустите основной lisp-режим. Я не хочу перезапускать lisp-режим каждый раз, когда обновляю ключевые слова, потому что у меня есть несколько ловушек в lisp-режиме, которые я хочу запускать только при первой загрузке файла.

Есть ли другой способ обновить блокировку шрифта, чтобы он считывал все, а затем новые ключевые слова и соответственно обозначал буфер? Отключение блокировки шрифта и использование font-lock-fontify-buffer не помогает.

UPD: добавлена ​​щедрость - вопрос еще не решен. Мне нужен способ перезагрузить ключевое слово font-lock без перезагрузки основного режима.

Ответы [ 3 ]

5 голосов
/ 18 сентября 2009

Хорошо, как насчет этого:

(defun my-font-lock-restart ()
  (interactive)
  (setq font-lock-mode-major-mode nil)
  (font-lock-fontify-buffer))
1 голос
/ 16 сентября 2009

Вы можете временно очистить переменную ловушки режима и перезапустить ее:

(defun my-restart-lisp-mode ()
  (interactive)
  (let ((lisp-mode-hook nil))
    (normal-mode)))
1 голос
/ 16 сентября 2009

Запуск основного режима - это не то, что заставляет font-lock делать свое дело. Я не очень хорошо знаком с внутренностями SLIME или lisp-mode, но просто установка переменной должна заставить ее работать. Переключение font-lock-mode заставит font-lock начать рефонтификацию с учетом новых ключевых слов, как и font-lock-fontify-buffer.

В основном я взламываю cperl-mode, это просто cperl-init-faces (который устанавливает внутренние переменные font-lock) и перезапуск font-lock. Режим lisp не должен сильно отличаться, за исключением того, что не требуется вызов cperl-init-faces;)

Edit: некоторые эксперименты с lisp-взаимодействием-режимом показывают, что даже перезапуск font-lock-mode не является строго необходимым. Достаточно просто поменять ключевые слова font-lock, если вы как-то повторно активируете фонтификацию. (Редактирование текста, font-lock-fontify-buffer и т. Д.)

...