鑒於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則代表要打開的文件。最好把所有的帶有路徑的部分都加上引號,以防止空格的”騷擾“。如下圖:
右鍵菜單的效果如下圖: