Eternal Embrace

关于 Conkeror 在 macOS 上使用 emacsclient

Conkeror 是一个提供类 Emacs 界面的浏览器,对于我这个已经
开始从 Evil 转向 Emacs默认键位的人来说应该是很不错的选择。

虽然知道有 Keysnail,但是我还是选择 Conkeror,先是我已经在用 Safari 了,只是需要
一个 Fallback 的浏览器以备不时之需,顺带提供在使用 Emacs 之时有顺滑的全键盘体验
(至少目前 XWidget + WebKit 的内置浏览器体验还不足,再是 Conkeror 提供的界面更干
净些,也确实有些 Killer Features。

配置上,官方 Wiki 已经有详细的范例了。不再赘述。

不过在 macOS 上使用 external-editing 时,有些问题需要解决。因为从 GUI 启动的
Emacs.app (或者用 open命令打开的),启用 server 时,在 Terminal.app 中用
emacsclient 连接是没什么问题的,但是从同样是 GUI 启动的 Conkeror 调用
emacsclient 出现会找不到 server 的情况。初步怀疑是环境变量的问题,开始找资料,
但是几个构想都不可行。

然后我在 EmacsWiki 上意外找到和我相似问题的解决办法:

1
(setq server-socket-dir (format "/tmp/emacs%d" (user-uid)))

原理是让 server 路径变成标准路径。

好吧,还没完,这样设置以后,我用 magit commit 的时候就出事了,出现了找不到
server 的提升!

又来?我看了看错误提示,发现使用的 emacsclient 是在很奇怪的路径,也就是
/var/ 路径下的,上 magit 的 github 页面,发现它是用 with-editor 这个宏来确
保使用了正确的 emacsclient 并正确连接到 server。

一般来说,其实只要用了 Emacs.app 自带的那个 emacsclient 就 OK 了,重点在于要指
定 socket。但是这个 socket 似乎是不断变化的,怎么办?

其实这个 socket 就是 with-editor-emacsclient-executable 的值,用 shell 解释
就是:

1
${TMPDIR}emacs${UID}/server

所以最终解决方案是:

1
editor_shell_command = "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -s ${TMPDIR}emacs${UID}/server"

完美……个头!

其实 external-editing 还是有些 bug 的,不过还算能忍受。

就到这里了。