org-protocol.el是一个elisp程序,它可以解析来自emacsclient的输入,触
发预先配置好的自定义动作。org-protocol接受的输入应该是一个符合URL格式的字
符串(作为emacsclient的FILE参数),使用```org-protocol``作为协议名
称,具体格式如下:
org-protocol:/sub-protocol:/URL/TITLE
sub-protocol是由用户自定义的,每个sub-protocol可以关联各自的处理程序。
org-protocol预定义的四个sub-protocol是:
store-link: 保存一个org-link,并将URL加入kill-ring。capture: 使用org-capture将传入的内容加入一个.org文件。remember: 使用org-remember保存传入的内容。由于org-remember已经被org-capture代替,所以这个只是为了向前兼容。open-source: 打开并编辑一个本地文件(由URL指定)。
虽然预定义的四个sub-protocol都使用了OrgMode的功能(open-source不算),你
自己写的sub-protocol的action完全不受这个限制。
org-protocol官网有
详细的说明。
对org-protocol的一个典型用户法是在浏览器中配置一个“bookmarklet”,使用时只要选
中网页中感兴趣的内容,然后运行这个bookmarklet就能将选中的内容使用预先定义好的
org-capture模板抓到指定的.org文件中,从而实现对网上内容做摘抄的功能。
在Stackoverflow的 这个回答 中有比较详细的步骤描述。但是这个步骤是针对Linux的,在MacOS上不适用的。
org-protocol的设计思路是使用操作系统的自定义URL协议处理程序的机制工作的,即
预先配置org-protocol协议的处理程序(emacsclient),然后在bookmarklet中打开
org-protocol协议的URL(如上文所示的格式)(或用其它方式打开),就会运行emacsclient,从而在
emacs中触发org-protocol。在Linux上,可以配置任何可执行文件作为自定义URL
协议的处理程序,但是在MacOS中只能使用打包好的Application,这样就不能直接使用
emacsclient了。
在org-protocol的官网上介绍了一个
EmacsClient.app,这个
App已经配置为能够处理org-protocol协议。但是这个App并不是调用
emacsclient,而是似乎直接调用了Aquamacs,因此它要求系统中预先安装了
Aquamacs。而如果系统中安装的是别的emacs版本,比如我用homebrew安装的
版本,则这个App不能工作。
幸好,根据
这篇文章
,自己写一个自定义URL的处理程序,并且调用emacsclient并不是件困难的事情。
简单说,只要用“脚本编辑器”写这样一个简单的Apple Script脚本:
on open location this_URL
do shell script "/usr/local/Cellar/emacs/HEAD/bin/emacsclient " & this_URL
tell application "Emacs" to activate
end open location
注意修改其中emacsclient的安装路径。
然后将这个脚本保存为一个“应用程序”(Application),并保存在/Applications目录下。
在Finder中找到刚才保存的应用程序,显示包内容,找到Info.plist文件,在文件中加入以下内容:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>SysPref Handler</string>
<key>CFBundleURLSchemes</key>
<array>
<string>org-protocol</string>
</array>
</dict>
</array>
这几行就是表明这个应用可以处理org-protocol这个URL protocol。双击运行这个应用可以使该应用生效。
最后介绍另一个有用的elisp程序:org-protocol-capture-html,它可以将通过bookmarklet摘取的html内容通过pandoc转换为org-mode的格式。在它的主页上有详细的配置说明。