43.1.2 初始化文件

启动 Emacs 时,通常会尝试加载你的 初始化文件(init file)。 该文件可以是家目录下名为 .emacs.emacs.el 的文件, 也可以是家目录下 .emacs.d 子目录中的 init.el

命令行开关 ‘-q’、‘-Q’、‘-u’ 控制是否加载及从何处加载初始化文件; ‘-q’(以及更强的 ‘-Q’)表示不加载初始化文件, 而 ‘-u user’ 表示加载 user 的初始化文件而非你的。 See Entering Emacs in The GNU Emacs Manual。 若未指定选项,Emacs 使用 LOGNAME 环境变量, 或 USER(多数系统)、USERNAME(MS 系统)变量查找家目录与初始化文件; 即使切换用户(su),Emacs 仍会加载你自己的配置。 若这些环境变量不存在,Emacs 会通过用户 ID 查找家目录。

Emacs 还会尝试加载第二个初始化文件,即 早期初始化文件(early init file)(若存在)。 该文件为你 ~/.emacs.d 目录下的 early-init.el。 早期初始化文件与普通初始化文件的区别在于,前者在启动过程中加载更早, 可用于自定义普通初始化文件加载前初始化的部分内容。 例如,可通过设置 package-load-listpackage-enable-at-startup 等变量 自定义包系统初始化流程。See Package Installation in The GNU Emacs Manual

Emacs 安装可能包含 默认初始化文件(default init file),即名为 default.el 的 Lisp 库。 Emacs 通过标准库搜索路径查找该文件(see 程序的加载方式)。 Emacs 发行版本身不附带此文件,它用于本地自定义。 若默认初始化文件存在,每次启动 Emacs 时都会加载。 但你个人的初始化文件(若有)会优先加载;若其将 inhibit-default-init 设为非 nil 值,Emacs 后续便不会加载 default.el。 批处理模式或指定 ‘-q’(‘-Q’)时,Emacs 既不加载个人配置也不加载默认配置。

另一个站点级自定义文件是 site-start.el。Emacs 在用户初始化文件**之前**加载该文件。 可通过 ‘--no-site-file’ 选项禁用加载。

User Option: site-run-file

该变量指定在用户初始化文件前加载的站点级自定义文件,默认值为 "site-start"。 唯一能有效修改它的方式是在 Emacs 转储前进行设置。

See Init File Examples in The GNU Emacs Manual, 查看在 .emacs 中实现常见自定义的示例。

User Option: inhibit-default-init

若该变量非 nil,阻止 Emacs 加载默认初始化库文件。默认值为 nil

Variable: before-init-hook

该常规钩子在加载所有初始化文件(site-start.el、个人初始化文件、default.el)之前运行一次。 (唯一能有效修改它的方式是在 Emacs 转储前。)

Variable: after-init-hook

该常规钩子在加载所有初始化文件(site-start.el、个人初始化文件、default.el)之后运行一次, 早于加载终端专用库(文本终端启动时)与处理命令行动作参数。

Variable: emacs-startup-hook

该常规钩子在处理完命令行参数后运行一次。批处理模式下不运行。

Variable: window-setup-hook

该常规钩子与 emacs-startup-hook 非常相似。 唯一区别是它在框架参数设置完成后稍晚运行。See window-setup-hook.

Variable: user-init-file

该变量保存用户初始化文件的绝对路径。 若实际加载的是编译后文件(如 .emacs.elc),该值仍指向对应的源文件。

Variable: user-emacs-directory

该变量保存 Emacs 默认目录名称。 若该目录存在且 ~/.emacs.d/~/.emacs 不存在, 默认值为 ${XDG_CONFIG_HOME-'~/.config'}/emacs/; 其他平台(MS-DOS 除外)均默认为 ~/.emacs.d/。 其中 ${XDG_CONFIG_HOME-'~/.config'} 表示环境变量 XDG_CONFIG_HOME 的值(若已设置), 否则为 ~/.config。 See How Emacs Finds Your Init File in The GNU Emacs Manual.