01 Dec 2011 - Tianjin - Happy

吾患有严重的折腾病,所以吾的Arch上有着GNOME、KDE、LXDE、XFCE等桌面环境,当然Opebox、awesome之类的WM也很多。

在这么多DE中切换时,默认应用程序的设置就成了老大难,可以看这里

经过一番折腾和网上的搜索后,写下此文作为备忘。

Reference:

  1. archwiki: Default Application
  2. freedesktop: Specifications/mime-actions-spec

xdg-open

包括chrome在内的很多程序都是通过调用xdg-open来打开文件和文件夹,所以我们先来看看这个命令。

xdg-open file:///home/
xdg-open /tmp/foobar.png

通过which命令便可知xdg-open是位于/usr/bin/xdg-open的shell脚本,这个脚本的基本工作流程是:

  1. 判断桌面环境,将其写入DE变量,如gnomekdexfcelxde。所以单用openboxawesome之类的窗口管理器的,可以在.xinitrc中强制指定DE
  2. 根据DE变量,调用诸如gnome-openkde-openexo-open等命令。
  3. 如果不是桌面环境,就调用通过xdg-mime命令查询到的对应程序打开。
  4. xdg-mime也是shell脚本,它主要的工作就是维护 mime-typedefault program之间的对应关系。
  5. xdg-mime用法很多,其中我们关心的query default,也就是查询对应的默认程序的工作原理如下:
    1. 首先探测桌面环境,存入DE变量。
    2. 如果是KDE下,用ktraderclient命令查询
    3. 其他情况,依次查询$HOME/.local/share/applications/default.list/usr/share/applications/default.list

根据Ref2的构思:新装的软件则将配置放入全局mimeapps.list中,用户则可以修改用户级的mimeapps.list,不过看xdg-openxdg-mime的源码,这个构想应该还没完全实现。

default.list

default.list文件格式相对简单,如:

application/x-php=gedit.desktop
application/x-python=gedit.desktop

后面的.desktop文件,必须得存在于$HOME/.local/share/applications/usr/share/applicaitons目录下,且满足特定的格式,见Desktop Entry Specification

mimeapps.list

mimeapps.list类似于default.list,但其有两端,一段和后者相同:[Default Applications],另一段是[Added Associations]

格式可以参考Ref2,简单用法和default.list一样。

相关测试结果(GNOME 3.2, KDE 4.7.3):

  1. gnome-open: [Added Addociations]段貌似无效。
  2. gnome-open: mimeapps.list 优先级高于 default.list
  3. KDE下mimeapps.listdefault.list均无效。

Result:

从以上的分析可知,目前想要修改默认程序,根据桌面的不同,有以下步骤:

  1. 如果是KDE,只能使用桌面环境自带的文件关联程序
  2. 其余情况,应该优先使用桌面环境自带的文件关联程序 。
  3. [不推荐,不清晰,未测试]可通过xdg-mime对文件关联进行设置,可自动对应多个桌面环境。
  4. GNOME中,通过对gnome-open的试验,发现其支持mimeapps.list ,且优先级大于default.list,优先设定mimeapp.list
  5. [不推荐]最后可修改default.list

顺便一提,文件夹对应的mimeinode/directory,这个确实不太好找。

Tips:

  1. 对arch用户,当gnome的default.list混乱时,可以参见AUR上gnome-defaults-list包。