我正在对SLIME进行小修改,以便我可以从Lisp获取所有当前加载的符号,分析它们并使字体锁定为它们。
我设法完成了所有这些步骤,但是我遇到了一个小问题 - 当font-lock中的关键字列表发生更改时,除非重新启动主要的lisp-mode,否则缓冲区不会更新。每次更新关键字时我都不想重新启动lisp-mode,因为我在lisp-mode上有几个挂钩,我想在第一次加载文件时才运行它。
是否有其他方法来更新font-lock,以便它读取所有新关键字并相应地为缓冲区提供信息?关闭字体锁并使用font-lock-fontify-buffer
不起作用。
UPD:增加了赏金 - 问题依然存在。我需要一种方法来重新加载font-lock关键字而无需重新加载主模式。
答案 0 :(得分:5)
好的,相反如何:
(defun my-font-lock-restart ()
(interactive)
(setq font-lock-mode-major-mode nil)
(font-lock-fontify-buffer))
答案 1 :(得分:1)
触发主模式并不是什么让font-lock能够做到这一点。我并不熟悉SLIME或lisp-mode的内部结构,但只是设置变量应该可以使它工作。切换字体锁定模式会使字体锁开始使用新关键字进行重新定义,font-lock-fontify-buffer
也应如此。
我主要攻击cperl-mode,这是cperl-init-faces
(设置内部字体锁定变量)和重启font-lock的简单问题。 lisp-mode应该没有太大的不同,除了不需要调用cperl-init-faces
;)
编辑:对lisp-interaction-mode进行的一些实验表明,即使重新启动font-lock-mode也不是必需的。只要你以某种方式重新触发fontification,只需更改font-lock-keywords就足够了。 (编辑文本,font-lock-fontify-buffer等)
答案 2 :(得分:1)
您可以暂时清除模式挂钩变量并重新启动它:
(defun my-restart-lisp-mode ()
(interactive)
(let ((lisp-mode-hook nil))
(normal-mode)))