Use org-protocol on Mac OS

emacs 2015-12-01

org-protocol.el是一个elisp程序,它可以解析来自emacsclient的输入,触 发预先配置好的自定义动作。org-protocol接受的输入应该是一个符合URL格式的字 符串(作为emacsclientFILE参数),使用```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-protocolaction完全不受这个限制。

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的格式。在它的主页上有详细的配置说明。



blog comments powered by Disqus