启动过程总结
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
。