我正在对SLIME进行小修改,以便我可以从Lisp获取所有当前加载的符号,分析它们并使字体锁定为它们。

我设法完成了所有这些步骤,但是我遇到了一个小问题 - 当font-lock中的关键字列表发生更改时,除非重新启动主要的lisp-mode,否则缓冲区不会更新。每次更新关键字时我都不想重新启动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))

其他提示

触发主模式并不是什么让font-lock能够做到这一点。我并不熟悉SLIME或lisp-mode的内部结构,但只是设置变量应该可以使它工作。切换font-lock-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等)

您可以暂时清除模式挂钩变量并重新启动它:

(defun my-restart-lisp-mode ()
  (interactive)
  (let ((lisp-mode-hook nil))
    (normal-mode)))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top