因爲我在平日的學習與工做中會常常用到Cygwin中的Emacs,很天然地想到應該將emacsclient做爲指定文件類型在Windows explorer中的默認打開程序。這樣,即可以直接雙擊文件後在Emacs中編輯,從而省去了在Cygwin命令行下手動輸入路徑與文件名的麻煩,亦能夠用方便快捷的Windows explorer替代Emacs Dired mode。要實現這樣的功能,須要解決兩個問題:學習
個人解決辦法是:建立一個Windows批處理文件emacsclient.bat,將指定文件類型的默認打開程序與之關聯。該批處理文件獲取在Windows explorer中被雙擊的文件路徑名,用UTF-8編碼存入臨時文件。而後,從該文件中提取出路徑字符串,將其做爲emacsclient的參數調用執行。該批處理文件emacsclient.bat的內容以下:編碼
@echo off touch "/cygdrive/c/.emacsclient_gbk.tmp" cygpath %1 > C:\.emacsclient_gbk.tmp iconv -f GBK -t UTF-8 -o "/cygdrive/c/.emacsclient_utf8.tmp" "/cygdrive/c/.emacsclient_gbk.tmp" for /f "usebackq delims=:" %%f in ("C:\.emacsclient_utf8.tmp") do emacsclient-w32.exe "%%f" @echo on
其中,操作系統
touch "/cygdrive/c/.emacsclient_gbk.tmp"
調用Cygwin的touch命令生成臨時文件.emacsclient_gbk.tmp,用於存放GBK編碼的待打開文件路徑名。須要注意,因爲touch是Cygwin命令,做爲其參數的臨時文件路徑名應採用Cygwin格式。 而後,調用cygpath命令,將待打開文件路徑名(以%1參數傳入emacsclient.bat)做爲標準輸出重定向到C:\.emacsclient_gbk.tmp。須要注意,因爲此時的標準輸出重定向是在Windows批處理文件中作的,因此臨時文件.emacsclient_gbk.tmp的路徑應採用Windows格式。值得一提的是,在首次調用emacsclient.bat前,臨時文件.emacsclient_gbk.tmp還沒有生成,而Windows批處理命令並不支持標準輸出重定向到一個不存在的文件。因此,在這以前調用touch命令生成該臨時文件是必須的。 再調用iconv命令進行編碼轉換,將UTF-8編碼的路徑名存入.emacsclient_utf8.tmp文件。命令行
iconv -f GBK -t UTF-8 -o "/cygdrive/c/.emacsclient_utf8.tmp" "/cygdrive/c/.emacsclient_gbk.tmp"
最後,從.emacsclient_utf8.tmp文件中提取出文件路徑名,交由emacsclient-w32程序打開。字符串