鉴于Emacs那神奇的启动速度,如果像Vim一样,每打开一个文件都启动一个Emacs的话,那肯定是无法忍受的,于是,Linux下可以使用emacs --deamon来启动Emacs作为一个守护进程,但该参数不支持windows平台(虽然说在windows平台使用Emacs是一件感觉很别扭的事情),估计是使用了windows平台没有的特性,具体使用的什么特性我并没有研究。
但是windows平台还是可以实现只启动Emacs单实例的,这样每次打开文件时用这个已经存在的实例打开即可,避免等待Emacs那尴尬的启动速度。其原理是启动一个Emacs实例作为server,监听某个端口,然后在需要打开文件时,利用client连接那个端口,将需要打开的文件路径等信息传递给server,然后作为server的Emacs收到路径信息后,找到文件并打开它。
要将Emacs启动为一个server,需要在Emacs的配置文件中加入以下命令:
(server-start)
这样,使用runemacs.exe启动Emacs后,在Home目录(HOME目录的设定及具体值请参看这里)的.emacs.d\server目录下会生成一个server文件,里面记录了Emacs实例的IP地址及端口号等信息,在退出Emacs后,这个文件就会被删除。
现在server已经起来了,下面就可以用client连接server了,在Emacs安装目录的bin目录下会有emacsclient.exe和emacsclientw.exe两个exe文件,前者基于命令行,后者有图形界面,使用client来连接server打开文件的命令如下:
emacsclientw.exe --no-wait --alternate-editor="runemacs.exe" "~/.emacs"
其中--no-wait参数告诉client不要等待Emacs server返回,而是直接退出;--alternate-editor参数指定一个fallback的编辑器,在server不存在的时候就使用该编辑器来打开文件,在这里指定为runemacs.exe,这样就可以在Emacs没运行的情况下运行Emacs并使用之进行编辑,第三个参数是要打开的文件,这里指定为HOME目录下的配置文件.emacs。在运行这个命令后,emacsclientw.exe会去<HOME>\.emacs.d\server目录下找到server文件,取出里面的IP地址和端口号,连接之,将"~/.emacs"传过去,然后作为server的Emacs打开该文件,因为有--no-wait参数,所以client不会等作为server的Emacs返回结果就直接退出了;当然如果在<HOME>\.emacs.d\server目录没有找到server文件的话,client就会调用runemacs.exe来打开该文件。
情况来了,我们不可能在每打开一个文件的时候就去命令行输入这么大一串东西,况且路径每次都有变化,所以,将“Edit with Emacs”加入右键菜单是不二选择,于是,在注册表中建如下键值:
HKEY_CLASSES_ROOT\*\shell\Edit with Emacs\command
并将其default的值设为:
"path\to\emacsclientw.exe" --no-wait --alternate-editor="path\to\runemacs.exe" "%1"
上述命令需要把emacsclientw.exe和runemacs.exe的路径换成实际路径,而后面的%1则代表要打开的文件。最好把所有的带有路径的部分都加上引号,以防止空格的”骚扰“。如下图:
右键菜单的效果如下图: