8

我正在对 SLIME 做一些小的修改,这样我就可以从 Lisp 中获取所有当前加载的符号,分析它们并使 font-lock 字体化它们。

我设法完成了所有这些步骤,但我有一个小问题 - 当字体锁定中的关键字列表更改时,除非您重新启动主要的 lisp 模式,否则缓冲区不会更新。我不想每次更新关键字时都重新启动 lisp-mode,因为我在 lisp-mode 上有几个挂钩,我只想在第一次加载文件时才运行它们。

是否有其他方法来更新字体锁定,以便它读取所有新的关键字并相应地对缓冲区进行字体化?关闭字体锁定并使用font-lock-fontify-buffer并不能解决问题。

UPD:增加了赏金-问题仍然存在。我需要一种在不重新加载主要模式的情况下重新加载 font-lock 关键字的方法。

4

3 回答 3

5

好的,这个怎么样:

(defun my-font-lock-restart ()
  (interactive)
  (setq font-lock-mode-major-mode nil)
  (font-lock-fontify-buffer))
于 2009-09-18T15:18:25.060 回答
2

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

(defun my-restart-lisp-mode ()
  (interactive)
  (let ((lisp-mode-hook nil))
    (normal-mode)))
于 2009-09-16T17:31:30.683 回答
1

触发主模式并不是让 font-lock 发挥作用的原因。我对 SLIME 或 lisp-mode 的内部结构并不熟悉,但只需设置变量即可使其工作。切换 font-lock-mode 将使 font-lock 开始使用新关键字重新字体化,就像font-lock-fontify-buffer.

我主要使用 cperl 模式,这是一个简单的问题cperl-init-faces(设置内部字体锁定变量)和重新启动字体锁定。lisp-mode 应该没有太大的不同,除了不需要调用cperl-init-faces;)

编辑:对 lisp-interaction-mode 的一些实验表明,即使重新启动 font-lock-mode 也不是绝对必要的。只要您以某种方式重新触发字体化,只需更改 font-lock-keywords 就足够了。(编辑文本、font-lock-fontify-buffer 等)

于 2009-09-16T09:12:24.193 回答