加载前的Emacs setq

加载前的Emacs setq,emacs,dot-emacs,Emacs,Dot Emacs,自定义Emacs时,我是在加载包之前还是之后设置相应的变量 i、 e 或 在我看来,除了一些包在加载后显式要求init外,大多数情况下这两种方法都有效。我说得对吗?你说得对,这两种情况通常都可以接受。但在特殊情况下并不总是如此 例如,您必须了解,如果在运行*python*进程后设置pythonshell解释器,则不会更改*python*可执行文件。您必须杀死*Python*缓冲区并再次运行它,以使更改生效 还有一些变量在文件加载时绑定,具体取决于其他变量的值。所以对基变量的更改不会传播到派生值。

自定义Emacs时,我是在加载包之前还是之后设置相应的变量

i、 e


在我看来,除了一些包在加载后显式要求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文件中的什么时候执行此操作,即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)
    ))