自定义Emacs时,在加载包之前或之后是否设置相应的变量?
即
(setq some-variable some-value)
(require 'some-package)
Run Code Online (Sandbox Code Playgroud)
要么
(require 'some-package)
(setq some-variable some-value)
Run Code Online (Sandbox Code Playgroud)
在我看来,除非某些软件包在加载后明确要求init,否则大部分时间都可以工作.我对吗?
如果变量是用户选项,请在加载包之前执行。该包包含defcustom定义选项的 ,但defcustom如果变量已经有值(例如,来自您的setq),则不会设置该值。
类似地,如果变量是全局定义的变量而不是用户选项,即由包使用defvar. defvar,如defcustom,不会覆盖现有值。
另一方面,根据变量,有时您希望在加载包后更改其值。这完全取决于包的作用以及该变量的使用方式。
不管我上面说了什么,IMO在您的 init 文件中使用更改全局变量值(无论是否选项)通常是一个坏主意setq。
对于一个选项,最好使用自定义 UI 对其进行自定义,或者使用其中一个函数custom-set-variables或customize-set-variable 在您的 init 文件中(即,明确地,您自己)。这是因为defcustom定义选项可以具有用于值初始化和更新的“触发器”(并且可以具有其他特殊处理)。并且给定的值defcustom可以依赖于文件中出现在它之前的其他内容来评估其默认值表达式。
如果您只是setq用来初始化或更新选项,那么您可以绕过任何此类特殊处理,这可能不是您想要的,并且可能会导致意外。
同样,但一般来说不太重要,除非您确定自己在做什么,否则简单地setq在非选项(即defvar)变量上使用可能是一个坏主意。
我的建议:使用自定义,但不要让它写入您的 init 文件。相反,定义变量custom-file(实际上,它是一个选项,但您不能真正像使用它一样使用它),以便自定义写入该单独的文件并保留您的 init 文件供您手动修改。(您仍然可以customize-set-variable在 init 文件中使用。)
如果这样做,则需要custom-file从 init file加载文件。您可以决定在 init 文件中的哪个点执行此操作,即 init 文件中的给定变量设置应该在加载之前还是之后custom-file(自定义管理的设置)。
你是对的,这两种情况通常都是可以接受的。但在特殊情况下并不总是如此。
您必须了解,例如,如果您python-shell-interpreter在运行*Python*进程后设置 - 它不会更改*Python*可执行文件。您必须终止*Python*缓冲区并再次运行它才能使更改生效。
还有一些变量在文件加载时绑定,具体取决于另一个变量的值。因此对基本变量的更改不会传播到派生值。只需阅读源代码即可检查这一点。
因此,如果您在.emacs两种情况下放置代码,则基本上是等效的,除非模式文档另有说明(请阅读手册中有关 Emacs 加载过程的内容,在该阶段 Emacs 不会处理任何用户缓冲区)。
但是,如果您在某些缓冲区处理后更改变量 - 它可能不起作用。当 Emacs 处理用户缓冲区时,它可以初始化/填充内部缓存。很难找到这个缓存(您必须阅读源代码或文档)并了解如何重置或触发重新加载(将其设置为nil或调用某些mode-reinit函数)。
有些软件包,如 Gnus,允许干净卸载 ( gnus-group-exit),因此您可以再次加载它,就像之前没有加载一样...
无论如何,我发现阅读 Emacs 源代码非常容易 - 如果您有问题,只需查看变量/函数声明即可了解它如何设置以及它使用的 vlaues。
这个例子来自我在加载之前需要调整模式的地方(所以如果我更喜欢使用 Cygwin 并在 INFOPATH 环境变量中工作.emacs,则本机 Emacs 不会使用):;:
;; 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)
))
Run Code Online (Sandbox Code Playgroud)