org-mode 中打开链接

November 29, 2007 – 11:47 pm

最近在准备在下次 Linux World 2007 @ ZJU 讲座的 Presentation ,其中有一个 video ,想在 org-mode 里面直接打开。org-mode 处理链接的能力还是比较强的,按 C-c C-o 打开链接

  • 如果是文件内部链接的话,它会直接跳到那里。
  • 如果是普通文本文件,会直接用 Emacs 新开一个 buffer 打开。
  • 其他各种类型的文件都会用合适的程序打开。例如我在 Debian 里装了 xloadimage ,它会用这个程序来打开图片。

不过当我打开 video 的时候它选择了 gmplayer ,而不是 mplayer 。我自己不太喜欢 gmplayer ,想换成 mplayer 。其实要定制也很方便,只要修改 org-file-apps 变量即可。可是我并没有在里面看到 gmplayer 的字样,所以对其处理办法有些好奇,决定一探。

事实上我一直觉得在 Linux 中桌面环境很杂乱,哪种类型的文件由什么程序打开都有各种各样的定制方式,KDE、Gnome 都是各自一套,不过这次我的 Debian 里面这两个东西都没有安装,我猜 X 自己肯定也有一套东西的,或者甚至连 X 都不依赖,因为 file 命令都能识别出 mime 类型嘛。

于是我用 edebug 稍微跟踪了一下(edebug 我只会用一个命令:空格执行下一步 ;) ),再看了下源代码,发现 org-mode 在找不到合适的程序的时候就会让 mailcap 来帮忙。Emacs 的 mailcap 则是通过解析系统里面的配置文件来寻找合适的程序。然后 man 了一下,果然 mailcap 被用来定义各种类型的文件的行为了,可以用 run-mailcap file 来实现 Windows 下双击文件的效果。

既然根源找到了,就可以修改了。最简单的办法就是建立 ~/.mailcap 文件,把 mplayer 添加进去:

video/*; mplayer %s

这样确实在本地是成功了,可是我演示的时候是通过 NX 开了一个远程的 Emacs 窗口,对 NX 的工作细节还不是很熟悉,似乎我主目录下的 .mailcap 被忽略掉了,总之我在远程打开的那个 Emacs 中得到的结果还是 gmplayer 。没关系,那就改系统级别的那个 maplcap 好了。/etc/mailcap 会在系统更新的时候被自动生成的内容覆盖掉,所以还是不要手工改了,不过 在man mailcap 的 SEE ALSO 那里提到了 mailcap.order ,一看名字就知道是我要找的东西,于是再 man mailcap.order

粗略地看了一下,然后编辑 /etc/mailcap.order ,在第一行加入:

mplayer:video/*

这样可以让 mplayer 在 mailcap 中被排在更靠前的位置。然后运行 sudo update-mime ,再测试!失败了! :(

其实原因很简单了,mailcap.order 是用来给 mailcap 排序的,而 /etc/mailcap 里面压根就只有 gmplayer ,没有 mplayer !所以在 mailcap.order 里给 mplayer 一个更高的优先级也没有用。万恶的 mplayer ,那么我就来一招狠的,直接把 mplayer 做个软链接覆盖掉 gmplayer ! :D

正当我为自己想到的办法洋洋得意时,却发现 gmplayer 本来就只是一个指向 mplayer 的软链接。mplayer 用了一个 Unix 世界里很流行的 tricky : 同一个程序,做成一个主文件和几个(软)链接,然后根据 argv[0] 来执行不同的操作,“看上去”就像几个不同的程序一样了。这下我真认输了!

  1. 5 Responses to “org-mode 中打开链接”

  2. haha, 真所谓道高一尺魔高一丈

    By galilette on Nov 30, 2007

  3. Uninstall gmplayer :)

    By goncha on Dec 1, 2007

  4. to goncha:
    gmplayer 是在 mplayer 那个包里面被装起来的,要卸就两个都卸掉了。 :)

    By pluskid on Dec 1, 2007

  5. mplayer and g(nome-)mplayer are two different packages in Gentoo. What’s your distr?

    By goncha on Dec 2, 2007

  6. Mine is Debian. And gmplayer is only a symlink to mplayer.

    By pluskid on Dec 2, 2007

Post a Comment