默认应用程序
不同程序会使用不同的方式实现默认应用程序关联。命令行程序通常使用环境变量,而图形应用程序则倾向于通过调用 GIO API、Qt API 或执行 /usr/bin/xdg-open(xdg-utils 的一部分),使用 XDG MIME 应用程序作为默认。由于 xdg-open 和 XDG MIME 应用程序相当复杂,因此开发了各种替代的资源打开器。下表列出了使用各种方法的应用程序示例。
| 方法 | 使用 XDG | 应用程序示例 | 检查关联 |
|---|---|---|---|
| GIO 的 GAppInfo | 是 | Firefox、GNOME 文件、PCManFM、Thunar、Thunderbird、Telegram |
gio mime mimetype
|
/usr/bin/xdg-open |
默认 | Chromium(打开下载的文件) |
xdg-mime query default mimetype
|
| 自定义 | 通常没有 | mc、ranger | – |
| 环境变量 | 否 | man、sudoedit、systemctl | – |
| D-Bus 的 FileManager1 | org.freedesktop.FileManager1 | Firefox(打开包含文件的文件夹)、Zotero(显示文件)、Telegram(在文件夹中显示) | – |
许多桌面环境和图形文件管理器提供用于配置默认应用程序的图形界面。
application/rss+xml 解析为由自身打开,就是因为该类型是 application/xml 的子类,而 Firefox 正是 application/xml 的默认处理程序。背景信息
程序有时需要使用用户首选的应用程序打开文件或 URI,这需要检测文件类型(通常通过扩展名或魔术数字映射到 MIME 类型),并将其关联到应用程序。
传承自 UNIX 的程序(Heirloom UNIX programs)使用 mime.types 检测 MIME 类型,使用 mailcap 将其关联到应用程序。
资源打开器
- XDG MIME 应用程序:遵循 XDG MIME 应用程序规范
- 正则表达式:允许使用正则表达式将 MIME 类型与应用程序关联
- URI 支持:允许将任意 URI 方案(scheme)与应用程序关联
| 名称 | 包 | XDG MIME 应用程序 | 正则表达式 | URI 支持 |
|---|---|---|---|---|
| xdg-open | xdg-utils | 是 | 否 | 是 |
| gio(1) | glib2包 | 是 | – | 是 |
| mimeopen(1p) | perl-file-mimeinfo包 | 是 | 否 | 否 |
| mimeo | mimeoAUR | 是 | 是 | 是 |
| mimi | mimiAUR、mimi-gitAUR | 否 | 否 | 部分 |
| busking | busking-gitAUR | 否 | 是 | 是 |
| rifle(1) | ranger | 否 | 是 | 否 |
| handlr | handlr-regex包 | 是 | 是 | 是 |
| clifm | clifmAUR | 否 | 是 | 部分 |
| mimejs-git | mimejs-gitAUR | 否 | 否 | 是 |
xdg-open
xdg-open(xdg-utils 的一部分)遵循 XDG MIME 应用程序规范,并由许多程序使用。
因为 xdg-utils 版本的 xdg-open 比较复杂,默认应用程序错误时可能很难调试,所以出现了许多尝试改进它的替代方案。其中一些替代方案通过直接替换 /usr/bin/xdg-open 可执行文件,能够改变大多数应用程序的行为。其它则仅提供选择默认应用程序的一种替代方法。
perl-file-mimeinfo
perl-file-mimeinfo包 提供 mimeopen(1p) 和 mimetype(1p) 两个工具。提供的界面比 xdg-utils包 的对应工具更好一些:
# 确定文件的 MIME 类型
$ mimetype photo.jpeg
photo.jpeg: image/jpeg
# 关联文件类型到默认应用程序
$ mimeopen -d photo.jpeg
Please choose a default application for files of type image/jpeg
1) Feh (feh)
2) GNU 图像处理程序 (gimp)
3) Pinta (pinta)
use application #
# 使用默认应用程序打开文件
$ mimeopen -n photo.jpeg
最重要的是,如果没有检测到桌面环境,xdg-utils 会调用 file 而不是 mimetype 来进行 MIME 类型检测。这很重要,因为 file 并不遵循 XDG 规范。
- 在 0.28-1 版本之前,它不读取发行版范围的默认设置,并且将其配置保存在已弃用的位置。
- 截至 0.35-3 版本,它仍未遵循规范,没有实现 glob 解析优先级、glob 权重和魔术数字优先级。安装该软件包可能会悄然改变
xdg-mime和xdg-open对于一组与相同文件扩展名关联的 MIME 类型的处理行为。
mimeo
mimeoAUR 提供 mimeo 工具,兼具 xdg-open 和 xdg-mime 的功能。
以下示例展示了如何将 SVG 文件与 Inkscape 关联:
# 确定文件的 MIME 类型 $ mimeo --mimetype Svg_example2.svg Svg_example2.svg image/svg+xml # 确定与可执行文件 "inkscape" 相关联的桌面项 $ mimeo --app2desk inkscape inkscape org.inkscape.Inkscape.desktop # 查找桌面项路径 $ mimeo --finddesk org.inkscape.Inkscape.desktop /usr/share/applications/org.inkscape.Inkscape.desktop # 选择此 MIME 类型的默认应用程序 $ mimeo --prefer image/svg+xml org.inkscape.Inkscape.desktop # 检查关联 $ mimeo --mime2desk image/svg+xml image/svg+xml org.inkscape.Inkscape.desktop # 使用默认应用程序打开文件 $ mimeo Svg_example2.svg
还可以查找 mimeapps.list 文件的路径:
$ mimeo --mimeapps-list /home/user/.config/mimeapps.list
与 xdg-utils 的一个主要区别是,mimeo 还支持自定义的“关联文件”,允许进行更复杂的关联。例如,可以根据匹配的正则表达式,传递特定的参数:
# 在 VLC 中打开 YouTube 链接而不打开新实例 vlc --one-instance --playlist-enqueue %U ^https?://(www.)?youtube.com/watch\?.*v=
xdg-utils-mimeoAUR 修补了 xdg-utils,使得 xdg-open 在未检测到桌面环境时回退到 mimeo。
handlr
handlr-regex包 由 Rust 编写,提供了与 xdg-open 和 xdg-mime 相同的功能,但界面更加简洁。
handlr-regex包 是 handlrAUR 的一个带有正则表达式支持的分支。
与 xdg-utils 相比,handlr 增加了以下功能:
- 通过扩展名设置关联,省去了查找或记住 MIME 类型的必要
- 校验 MIME 类型和扩展名是否正确
- 从
mimeapps.list中删除无效条目 - 扩展名不明确时,通过文件内容智能检测 MIME 类型
- 自动补全 MIME 类型、扩展名和桌面条目
- 设置任意命令作为正则表达式匹配时的处理程序
# 以下两个命令是相同的
handlr set .png feh.desktop
handlr set image/png feh.desktop
# 列出默认应用程序
handlr list
# 获取 MIME 类型/扩展名的处理程序
$ handlr get .png --json
{"handler":"pqiv.desktop","name":"pqiv","cmd":"/usr/bin/pqiv"}
# 启动处理程序,可选传递路径/URL
handlr launch x-scheme-handler/https
handlr launch x-scheme-handler/https -- https://google.ca
要用 handlr 替代 xdg-open,可以使用以下脚本遮蔽 xdg-open 文件:
#!/usr/bin/bash handlr open "$@"
clifm
clifm 内置 Lira 作为资源打开器,可以通过 --open 命令行选项作为独立资源打开器使用。其配置文件(~/.config/clifm/profiles/PROFILE_NAME/mimelist.clifm)支持对 MIME 类型和文件名(及扩展名)使用正则表达式。以下是几个示例:
# 打开常规文件 clifm --open /etc/hosts # 打开目录 clifm --open /media/data # 打开 URL(通过配置文件中与 text/http MIME 类型关联的应用程序) clifm --open www.archlinux.org
轻量替代品
以下包冲突并提供 xdg-utils包,通过提供自己的 /usr/bin/xdg-open 脚本直接替代 xdg-utils。
如果使用这些资源打开器但仍需要使用 xdg-utils包,请将这些资源打开器手动安装到在 PATH 中位于 /usr/bin 之前的目录下。
- mimiAUR、mimi-gitAUR ⸺ 130 行 Bash 脚本,可为每种 MIME 类型自定义命令参数
-
busking-gitAUR ⸺ 80 行 Perl 脚本,与
mimi类似,额外支持正则表达式规则
run-mailcap
xdg-open 在未检测到桌面环境时可能将请求委托给它处理。若同时使用了 mailcap包 默认提供的 /etc/mailcap,由于该文件中的条目会调用 xdg-open,这将导致无限循环。