Функция, использующая функции блокировки шрифта, требует перезапуска режима блокировки шрифта
Я не понимаю, как включается режим блокировки шрифтов. У меня нет заявления, которое запускает режим блокировки шрифта в моем init.el
, но, видимо, он всегда работает как второстепенный режим. Кроме того, у меня есть следующая функция:
(defun testregexfunc ()
(interactive)
(make-variable-buffer-local 'font-lock-extra-managed-props)
(add-to-list 'font-lock-extra-managed-props 'invisible)
(font-lock-add-keywords nil
'(("\\(\\[\\)\\([a-zA-Z0-9_]+\\)\\(\\]\\)"
(1 '(face nil invisible t))
(3 '(face nil invisible t))))))
Он использует специфичные для font-lock вещи. Но это только вступает в силу, как только я M-x testregexfunc
с последующим M-x font-lock-mode
дважды. Первый раз отключает режим блокировки шрифта, второй раз запускает его. Но сейчас он не работает как основной режим, так как буфер по-прежнему отображает режим, в котором он был до этого. Итак, я предполагаю, что функция устанавливает некоторые значения и вступает в силу только после перезапуска режима. Я подумал, может быть, мне нужно добавить хук в режим блокировки шрифтов, как это:
(add-hook
'font-lock-mode
'testregexfunc)
Нет... ничего не делает. Что мне нужно сделать, чтобы не перезапускать режим блокировки шрифта для работы функции?
Я получил эту функцию отсюда и изменил ее. Я не понимаю большую часть его определения, и документация по блокировке шрифтов мне не очень помогает:
https://emacs.stackexchange.com/questions/28154/using-font-lock-regexp-groups
1 ответ
Я думаю, что функции, которые вы ищете font-lock-flush
а также font-lock-ensure
которые вместе объявляют блокировку шрифта буфера устаревшей и затем повторно подтверждают это. Итак, вы можете изменить свою функцию следующим образом,
(defun testregexfunc (arg)
"Fontify buffer with new rules. With prefix arg restore default fontification."
(interactive "P")
(if arg
(font-lock-refresh-defaults) ;restore the defaults for the buffer
(make-variable-buffer-local 'font-lock-extra-managed-props)
(add-to-list 'font-lock-extra-managed-props 'invisible)
(font-lock-add-keywords nil ;make the "[" and "]" invisible
'(("\\(\\[\\)\\([a-zA-Z0-9_]+\\)\\(\\]\\)"
(1 '(face nil invisible t))
(3 '(face nil invisible t)))))
(font-lock-flush) ;declare the fontification out-of-date
(font-lock-ensure))) ;fontify the buffer using new rules