默认应用程序
程序以不同方式实现默认应用程序关联。命令行程序通常使用环境变量,而图形应用程序则倾向于通过 XDG MIME 应用程序,通过GIO API、Qt API或执行 /usr/bin/xdg-open
(xdg-utils 的一部分)来实现。由于 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 是该类型的默认处理程序。背景信息[编辑 | 编辑源代码]
程序有时需要在用户首选的应用程序中打开文件或 URI。要在用户首选的应用程序中打开文件,需要检测文件类型(通常使用文件名扩展名或魔术数字映射到MIME 类型),并且必须有与文件类型关联的应用程序。
Heirloom UNIX 程序使用 mime.types 进行MIME类型检测,并使用 mailcap 进行应用程序关联。
资源打开器[编辑 | 编辑源代码]
- XDG MIME 应用程序:实现 XDG MIME 应用程序规范
- RegEx 规则:允许使用正则表达式将MIME类型与应用程序关联
- URI 支持:允许将任意URI方案与应用程序关联
名称 | 包 | XDG MIME 应用程序 | RegEx 规则 | 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 请选择一个应用程序 1) Feh (feh) 2) GNU 图像处理程序 (gimp) 3) Pinta (pinta) 使用应用程序 # # 使用默认应用程序打开文件 $ mimeopen -n photo.jpeg
最重要的是,xdg-utils 程序如果未能检测到你的桌面环境,会调用 file
而不是 mimetype
来进行 MIME 类型检测。这很重要,因为 file
并不遵循 XDG 标准。
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
相比,它包含:
- 通过扩展名设置关联,省去了查找或记住 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
的替代,使用以下脚本进行影像:
#!/usr/bin/bash handlr open "$@"
clifm[编辑 | 编辑源代码]
Lira,clifm
内置的资源打开器,可以通过 --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
Minimalist replacements[编辑 | 编辑源代码]
以下包与 xdg-utils包 冲突并提供它们自己的 /usr/bin/xdg-open
脚本。
如果你想使用这些资源打开器,但仍希望使用 xdg-utils包,请手动将它们安装在 /usr/bin
之前的路径目录中。
- mimiAUR, mimi-gitAUR - 130 行 Bash 脚本,可以为每个 MIME 类型更改命令参数
- busking-gitAUR - 80 行 Perl 脚本,类似于 mimi,但也支持正则表达式规则
run-mailcap[编辑 | 编辑源代码]
xdg-open
可能会将其委托给它。如果你使用来自 mailcap包 的 /etc/mailcap
文件,这将导致无限循环,因为它也会委托给 xdg-open
。