虽然通过使用IBuffer已经可以很方便地在Emacs里随机访问文件夹里的某个文件了,但有的时候还是想在文件夹里直接通过Windows鼠标右键菜单在Emacs里打开特定文件。网上有很多地方介绍了方法,但没有能直接试成功的,总需要自己再稍微做一些修改。由于颇花了些时间,值得在这里记录一下,免得日后忘掉,或者给后来人做参考:
首先要修改注册表,为文件和目录添加鼠标右键菜单:创建一个reg文件,双击导入注册表就可以了。我的reg文件的内容如下:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell]
[HKEY_CLASSES_ROOT\*\shell\openwemacs]
@="Edit with &Emacs"
[HKEY_CLASSES_ROOT\*\shell\openwemacs\command]
@="c:\\green\\emacs-22.3\\bin\\emacsclientw.exe --server-file=d:\\.emacs.d\\server\\server --alternate-editor=C:\\green\\emacs-22.3\\bin\\Emacs.bat -n \"%1\""
[HKEY_CLASSES_ROOT\Directory\shell\openwemacs]
@="Edit &with Emacs"
[HKEY_CLASSES_ROOT\Directory\shell\openwemacs\command]
@="c:\\green\\emacs-22.3\\bin\\emacsclientw.exe --server-file=d:\\.emacs.d\\server\\server --alternate-editor=C:\\green\\emacs-22.3\\bin\\Emacs.bat -n \"%1\""
emacsclientw的意义是通知emacs服务打开指定的某个文件。它通过"--server-file"来找到后台运行的emacs服务,在连接emacs服务失败之后使用"--alternate-editor"来打开指定的文件。因此其具体效果就是当有emacs实例在运行时,在该实例里打开指定文件,否则新建一个emacs实例,然后在其中打开文件。可以通过执行
"emacsclientw.exe --help"
来查看emacsclientw命令的帮助。很显然,emacs服务在启动时应该设置一个跟"--server-file"对应的标记,以便emacsclientw稍后能够检测到它。这可以通过设置全局变量"EMACS_SERVER_FILE"来完成,这里马上就会讲到它。
其次,在emacs启动的时候,顺带启动emacs服务,以便将来emacsclientw可以与之交互。这可以通过在emacs设置文件".emacs"里添加一句话来完成
(server-start)
最后要设置相应的环境变量。我不喜欢在系统环境变量里添加太多的东西,因此写了一个批处理文件,每次试图启动emacs时执行这个批处理文件,将环境变量的作用域局限在这个Shell中。如果你使用了别的路径或者文件,那么前面的注册表文件需要做相应的修改:
@echo off
set HOME=D:\
set EMACS_SERVER_FILE=D:\.emacs.d\server
set PATH=C:\green\unixUtils;%PATH%
start c:\green\emacs-22.3\bin\runemacs.exe %1 %2 %3 %4
跟直接用runemacs打开文件不同,使用上述方法可以只在一个emacs的实例里打开多个文件,这不光使得emacs窗口更加紧凑,在某些情况下还会有额外的便利(比如使用”desktop”插件时)。上述方法的一个缺点是当emacsclientw连接emacs服务失败时,在启动一个新的emacs实例之前会跳出一个错误对话框。不过没什么影响,直接点掉就可以了。几个参考链接:
Setting up Emacs on Windows | irisquest.net
EmacsWiki: Emacs Client
How to create a right-click context shell shortcut "edit with Emacs"? - Stack Overflow