【问题标题】:How to reload an emacs major mode?如何重新加载 emacs 主模式?
【发布时间】:2010-12-05 16:00:52
【问题描述】:

我在某个主模式下有一个缓冲区,而在另一个缓冲区中则是模式文件本身 (*.el)。编辑 *.el 文件后,我想查看第一个缓冲区中反映的更改,而无需重新启动 emacs。我尝试运行 -mode 函数,但它没有更改缓冲区。 谢谢

【问题讨论】:

    标签: emacs reloading major-mode


    【解决方案1】:

    如果您的模式使用(provide 'foo-mode) 提供了一项功能(应该如此!),那么您可以

    M-x unload-feature RET foo-mode RET

    然后像往常一样再次加载模式(如果您有适当的自动加载,则使用 foo-mode,否则使用 load-libraryload-file)。

    【讨论】:

    • 我以前没见过这个。文档指出,如果有其他加载的代码需要该功能,这将引发错误,但您可以使用前缀 arg 强制卸载。
    • 了解其他加载的代码使用您的模块的情况很有用,因为即使您重新加载模块,其他模块也可能继续引用旧的函数定义。在这种情况下,您还需要重新加载另一个模块,以便它引用新定义。
    • +1,结合 Trey Jackson 的回答,这是为我做的。
    • 我尝试了M-x unload-feature RET web-mode RET,但出现错误:Loaded libraries (\"/home/kuba/.emacs\") depend on /home/kuba/projects/emacs-modes/web-mode/web-mode.el 我的 .emacs 中有 (require 'web-mode)
    • @jcubic C-u M-x unload-feature RET web-mode RET 可以解决问题。根据C-h f unload-feature RET,这会强制卸载操作。
    【解决方案2】:
    M-x load-file your-mode.el
    

    M-x eval-buffer
    

    然后在缓冲区中打开和关闭行为,大概是通过做

    M-x your-mode
    M-x your-mode
    

    或者,如果您的模式识别前缀参数

    C-u 1 M-x your-mode
    

    注意:当您加载文件时,defvar 不会覆盖现有值,因此如果您将调用中的值更改为 defvar,则需要通过执行 C-M-x 当您的光标位于 devfar 表达式中时,或使用 M-x : 并输入表达式。有关在 Emacs 中评估 lisp 的文档,请参阅 this page

    【讨论】:

    • 除了切换模式,你也可以M-x normal-mode
    【解决方案3】:

    当您编辑模式的源代码时,您必须确保评估您更改的函数——仅将它们保存到文件是不够的,因为 Emacs 内部仍将使用旧代码。

    例如,您可以跳到使用 M-C-e 处理的函数定义的末尾,并使用 C-x C-e 评估该函数。从那时起,Emacs 将使用当前定义。

    这也适用于模式定义,但通常使用 M-x 模式名称调用模式是作为切换实现的:你调用一次,它激活模式,你再次调用它,它取消激活模式。所以你可能不得不做两次 M-x mode-name。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2014-03-05
    • 2011-09-19
    相关资源
    最近更新 更多