emacs的启动过程
启动过程总结
emacs 启动在 lisp 源码里的顶级目录中的 startup.el 文件,如
/usr/share/emacs/26.1/lisp/startup.el
运行 load-path 里面每个目录中的 subdirs.el 文件,递归的把所有把子目录添加到路径中。
运行 load-path 中找到的用户创建的 leim-list.el 文件,Emacs 自带的忽略掉。这个文件用于注册输入法。
设置
before-init-time变量的时间为current-time目前时间,after-init-time为nil设置语言环境和终端的编码系统。
解析命令行参数。
如果不是以 bacth 模式运行,Emacs 初始化窗口系统,initital-window-system变量被指定。这个变量被指定后,就会在 term 目录下找到匹配的文件来初始化窗口。
运行
before-init-hook如果不是以 batch 模式或 daemon 模式运行,Emacs 会创建一个图形化的 Frame。
初始化 Frame 的外观。如果需要,设置菜单栏和工具栏。
通过
custom-reevaluate-setting重新初始化custom-delayed-init-variables列表中的变量。这些变量都是预先加载的用户选项,默认值取决于运行时,而不是构建时。如果启动选项里面没有
-Q或no-site-file。Emacs 会载入存在的site-start。如果启动选项里面没有
-Q,-q或--batch,Emacs 会加载用户的 init 文件,即我们自己写的配置。如果-u被指定,Emacs 会在用户的 home 目录寻找 init 文件如果启动选项里面没有
-q,-Q或--batch被指定,或者inhibit-default-init没有被设为nil,加载存在的default库文件。如果启动选项里没有
--batch且abbrev-file-name指定的 abbrev 文件存在且可读时,加载该文件。用
package-initialize函数激活已经安装的 package。但是如果package-enable-at-startup被设为 nil,或者启动选项里有-q,-Q,--batch,Emacs 不会激活 package,用户必须显示的调用 package-initialize(用--funcall或者写在 init 文件里。设置
after-init-time为目前的时间,结合before-init-time算出花了多少时间。运行
after-init-hook。设置
*scratch*buffer 的 major mode 为initial-major-mode的值。如果以文本终端启动,且启动选项里没有
--batch或term-file-prefix的值不为 nil,加载终端指定的库文件。如果
inhibit-startup-echo-area-messaeg为 nil,显示初始化的信息。处理前面没有处理的命令行参数。
如果以
--batch启动,emacs 在此时退出。如果
*scratch*Buffer 存在且为空,插入substitute-command-keys initial-scratch-message变量中的内容。如果
initial-choice-buffer是一个字符串,Emacs 用这个字符串作为名字打开对应的文件名或者文件目录;如果是一个函数,他不带参数的调用该函数,函数的返回值作为一个 buffer 被选择;如果启动选项带有一个文件名,这个文件被打开,然后显示在initial-choice-buffer的旁边;如果启动选项带有多个文件名,所有的文件都会被打开,然后*Buffer List*Buffer 显示在initial-choice-buffer的旁边。运行
emacs-startup-hook调用
frame-notice-user-settings,使在 init 文件中设置的 frame 参数生效。主要是initial-frame-alist,window-system-default-frame-alist,default-frame-alist,优先级递减运行
window-setup-hook显示默认的启动界面,包括版权信息和基本的 Emacs 用法。如果
inhibit-startup-screen和initial-choice-buffer不为 nil,或者启动参数带有-Q或--no-splash时不显示。如果 daemon 被要求,调用
start-server函数。如果通过 X 会话管理器启动,调用
emacs-session-restore。
新的 emacs 支持 early-init.el 文件,这个文件会在包管理系统和 GUI 系统初始化之前生效。