Обновление ключевых слов блокировки шрифта в emacs без перезагрузки основного режима

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

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

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

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


person freiksenet    schedule 16.09.2009    source источник


Ответы (3)


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

(defun my-font-lock-restart ()
  (interactive)
  (setq font-lock-mode-major-mode nil)
  (font-lock-fontify-buffer))
person scottfrazer    schedule 18.09.2009

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

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

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

person jrockway    schedule 16.09.2009
comment
Это очень странно. Что вы используете для изменения ключевых слов? Я использую ключевые слова-слова-замки-шрифты. - person freiksenet; 16.09.2009
comment
Перезапуск блокировки шрифта также не помогает, например, для режима Python. Может это моя версия Emacs? Какая у тебя версия? У меня GNU Emacs 23.1.50.1 на x86-64 Ubuntu. - person freiksenet; 16.09.2009

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

(defun my-restart-lisp-mode ()
  (interactive)
  (let ((lisp-mode-hook nil))
    (normal-mode)))
person scottfrazer    schedule 16.09.2009
comment
Круто, попробую вот это. Интересно, почему он не работает так, как по умолчанию описывается jrockway :) - person freiksenet; 16.09.2009
comment
Хорошо, это лучше, но это отключает все хуки, в том числе, например, крючок слизи, что нехорошо :( Мне правда интересно, можно ли это сделать без перезапуска режима. - person freiksenet; 16.09.2009