【问题标题】:Updating font-lock keywords in emacs without major mode reload在没有主模式重新加载的情况下更新 emacs 中的字体锁定关键字
【发布时间】:2009-09-16 09:07:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: emacs common-lisp elisp slime font-lock


    【解决方案1】:

    好的,不如这样:

    (defun my-font-lock-restart ()
      (interactive)
      (setq font-lock-mode-major-mode nil)
      (font-lock-fontify-buffer))
    

    【讨论】:

      【解决方案2】:

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

      (defun my-restart-lisp-mode ()
        (interactive)
        (let ((lisp-mode-hook nil))
          (normal-mode)))
      

      【讨论】:

      • 酷,我试试这个。我想知道为什么它不像默认描述的 jrockway 那样工作:)
      • 好吧,这样更好,但是这会禁用所有的钩子,例如包括粘液钩子,这不好:(我真的想知道是否可以在不重新启动模式的情况下做到这一点。
      • 这是唯一对我有用的建议。 jrockway 和 scottfrazer 的建议对我的系统没有任何影响(GNU Emacs 25.3 with Aquamacs customisation)。
      【解决方案3】:

      触发主模式并不是让字体锁定发挥作用的原因。我对 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等)

      【讨论】:

      • 这很奇怪。你用什么来修改关键字?我使用“font-lock-add-keywords”。
      • 字体锁定重启对于 python 模式也没有帮助。也许这是我的 Emacs 版本?你有什么版本?我在 x86-64 Ubuntu 上有 GNU Emacs 23.1.50.1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多