加载前的Emacs setq
自定义Emacs时,我是在加载包之前还是之后设置相应的变量 i、 e 或加载前的Emacs setq,emacs,dot-emacs,Emacs,Dot Emacs,自定义Emacs时,我是在加载包之前还是之后设置相应的变量 i、 e 或 在我看来,除了一些包在加载后显式要求init外,大多数情况下这两种方法都有效。我说得对吗?你说得对,这两种情况通常都可以接受。但在特殊情况下并不总是如此 例如,您必须了解,如果在运行*python*进程后设置pythonshell解释器,则不会更改*python*可执行文件。您必须杀死*Python*缓冲区并再次运行它,以使更改生效 还有一些变量在文件加载时绑定,具体取决于其他变量的值。所以对基变量的更改不会传播到派生值。
在我看来,除了一些包在加载后显式要求init外,大多数情况下这两种方法都有效。我说得对吗?你说得对,这两种情况通常都可以接受。但在特殊情况下并不总是如此 例如,您必须了解,如果在运行
*python*
进程后设置pythonshell解释器
,则不会更改*python*
可执行文件。您必须杀死*Python*
缓冲区并再次运行它,以使更改生效
还有一些变量在文件加载时绑定,具体取决于其他变量的值。所以对基变量的更改不会传播到派生值。只需阅读源代码来检查这一点
所以,如果您将代码放在.emacs
中,除非模式文档另有说明,否则这两种情况基本相同(请阅读手册中的emacs加载过程,在该阶段,emacs不处理任何用户缓冲区)
但是,如果在缓冲区处理后更改变量,则可能无法工作。当Emacs处理用户缓冲区时,它可以初始化/填充内部缓存。很难找到此缓存(您必须读取源代码或文档),也很难理解如何重置或触发重新加载(将其设置为nil
或调用一些mode reinit
函数)
有些软件包,比如Gnus,允许干净的卸载(Gnus组退出
),所以您可以再次加载它,就好像在
无论如何,我发现阅读Emacs源代码非常容易——如果您有问题,只需查看变量/函数声明,了解它是如何设置的以及它使用了什么vlaues
此示例来自我的.emacs
,其中我需要在加载前使用调优模式(因此,如果我更喜欢使用Cygwin和INFOPATH env var中的:
,则本机emacs不使用;
):
如果变量是用户选项,请在加载包之前执行此操作。软件包包含一个定义选项的
defcustom
,但是如果变量已经有值(例如,来自setq
),则defcustom
不会设置该值
类似地,如果变量是非用户选项的全局定义变量,即由包使用defvar
定义defvar
与defcustom
一样,不会覆盖现有值
另一方面,根据变量的不同,有时需要在加载包后更改其值。这完全取决于包的作用以及如何使用该变量
不管我上面说了什么,在我看来,在init文件中使用setq
更改全局变量值(无论选项与否)通常是一个坏主意
- 对于选项,最好使用自定义UI对其进行自定义,或者使用init文件中的函数
或自定义设置变量
(即,明确地说,您自己)。这是因为定义选项的自定义设置变量
可以具有用于值初始化和更新的“触发器”(也可以具有其他特殊处理)。给定的defcustom
可以依赖于文件中显示在其前面的其他内容来计算其默认值表达式 如果您只是使用defcustom
来初始化或更新选项,那么您将绕过任何此类特殊处理,这可能不是您想要的,并且可能会导致意外setq
- 类似地,但一般来说不太重要,除非您确定自己在做什么,否则在非选项(即
)变量上简单地使用defvar
可能是个坏主意setq
自定义文件
(实际上,它是一个选项,但您不能像使用它那样真正使用它),以便自定义写入该单独的文件,并将init文件留给您手动修改。(您仍然可以在init文件中使用自定义设置变量
。)
如果这样做,则需要从init文件中加载文件
自定义文件
。您可以决定在init文件中的什么时候执行此操作,即init文件中的给定变量设置应该在加载自定义文件之前还是之后进行(自定义管理的设置)。在大多数情况下,您不需要(require'mode)
,除非您需要调用一些非自动加载的函数!我正在考虑定制
,但在这种情况下,您必须将所有定制放在一个文件中。我仍然喜欢在xxx-conf.el
中分别配置每个包,就像在prelude
@gongzhitaao中一样:根据您的意思,您不必将所有自定义设置放在一个文件中。“自定义”将把它处理的所有自定义项放在一个文件中,但其他自定义项可以分布在任意多个文件中。在我看来,这是一个好主意,但是,通过定义变量custom file
并在适当的时间从init文件加载该文件,将自定义管理的内容从init文件中删除。从第一段开始,得出(加载自定义文件)应该在(包初始化)之前的结论是否正确?@JisangYoo:也许吧-我不是package.el的专家。大概,custom文件中的唯一内容是来自Customize,我认为是的,这可能是一个很好的方法。其他人可能有其他意见。
(setq some-variable some-value)
(require 'some-package)
(require 'some-package)
(setq some-variable some-value)
;; Assume that cygwin-mount already activated.
(when (featurep 'cygwin-mount)
(setenv "INFOPATH" "/usr/share/info/:~/usr/share/info/:")
;; Redefine path-separator to UNIX to update Info-directory-list.
(let ( (path-separator ":") )
(require 'info)
(info-initialize)
))