如何重新加载emacs主模式?

如何重新加载emacs主模式?,emacs,reloading,major-mode,Emacs,Reloading,Major Mode,我在一些主要模式中有一个缓冲区,在另一个缓冲区中有模式文件本身(*.el)。编辑*.el文件后,我希望看到第一个缓冲区中反映的更改,而无需重新启动emacs。我试图运行-mode函数,但它没有改变缓冲区。 谢谢当您编辑模式的源代码时,您必须确保您对所更改的函数进行了评估——仅将它们保存到文件中是不够的,因为Emacs内部仍将使用旧代码 例如,您可以跳转到使用M-C-e处理的函数定义的末尾,并使用C-x C-e对函数进行求值。从那时起,Emacs将使用当前定义 这也适用于模式定义,但通常情况下,使

我在一些主要模式中有一个缓冲区,在另一个缓冲区中有模式文件本身(*.el)。编辑*.el文件后,我希望看到第一个缓冲区中反映的更改,而无需重新启动emacs。我试图运行-mode函数,但它没有改变缓冲区。
谢谢

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

例如,您可以跳转到使用M-C-e处理的函数定义的末尾,并使用C-x C-e对函数进行求值。从那时起,Emacs将使用当前定义

这也适用于模式定义,但通常情况下,使用M-x模式名称调用模式是作为切换实现的:您调用它一次,它会激活模式,您再次调用它,它会取消激活模式。因此,您可能需要执行两次M-x模式名称

M-x load-file your-mode.el

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

M-x your-mode
M-x your-mode
或者,如果模式识别前缀参数

C-u 1 M-x your-mode

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

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

M-x卸载功能RET foo模式RET


然后再次以正常方式加载模式(如果您有合适的自动加载,则使用
foo模式
,或者使用
load library
load file
否则)。

除了切换模式外,您还可以执行
M-x正常模式
我以前从未见过这种情况。文档中指出,如果有其他加载的代码需要此功能,这将引发错误,但您可以使用前缀arg强制卸载。了解其他加载的代码使用模块的情况非常有用,因为即使重新加载模块,另一个模块可能会继续引用旧的函数定义。在这种情况下,您也需要重新加载另一个模块,以便它引用新的定义。+1,结合Trey Jackson的回答,这为我做到了。我尝试了
M-x卸载功能RET web mode RET
,但出现了错误:
加载的库(\“/home/kuba/.emacs\”)依赖于/home/kuba/projects/emacs modes/web mode/web mode.el
我的电脑中有
(需要“web mode”)
。emacs@jcubic
C-u M-x卸载功能RET web模式RET
将实现此功能。根据C-h f卸载功能RET,这将强制卸载操作。有关(重新)评估elisp的所有不同方法,请参阅
C-u 1 M-x your-mode