默认应用程序
程序以不同的方式实现默认应用程序关联。虽然命令行程序传统上使用 环境变量,但图形应用程序倾向于通过 XDG MIME Applications,通过 GIO API、Qt API 或执行 /usr/bin/xdg-open
(属于 xdg-utils)来实现。由于 xdg-open 和 XDG MIME Applications 非常复杂,因此开发了各种替代的 资源打开器。下表列出了每种方法的示例应用程序。
方法 | 使用 XDG | 应用程序示例 | 检查关联 |
---|---|---|---|
GIO 的 GAppInfo | 是 | Firefox, GNOME Files, 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 (在文件夹中显示) | – |
许多桌面环境和图形文件管理器提供了用于配置默认应用程序的 GUI。
application/rss+xml
解析为最终由自身打开,因为该类型继承了 application/xml
,而 Firefox 是该类型的默认处理程序。背景信息
程序有时需要使用用户首选的应用程序打开文件或 URI。 要使用用户首选的应用程序打开文件,需要检测文件类型(通常使用文件扩展名或映射到 MIME 类型 的 幻数),并且需要有与文件类型关联的应用程序。
Heirloom UNIX 程序使用 mime.types 进行 MIME 类型检测,并使用 mailcap 进行应用程序关联。
资源打开器
- XDG MIME Apps:实现 XDG MIME Applications 规范
- RegEx 规则:允许使用正则表达式将 MIME 类型与应用程序关联
- URI 支持:允许将任意 URI 方案与应用程序关联
名称 | 软件包 | XDG MIME Apps | 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 Applications,并被许多程序使用。
由于 xdg-utils 版本的 xdg-open 的复杂性,当打开错误的默认应用程序时,可能难以调试。 因此,有许多替代方案试图改进它。 其中一些替代方案替换了 /usr/bin/xdg-open
可执行文件,从而更改了大多数应用程序的默认应用程序行为。 其他方案只是提供了选择默认应用程序的替代方法。
perl-file-mimeinfo
perl-file-mimeinfo 提供了工具 mimeopen(1p) 和 mimetype(1p)。 这些工具比 xdg-utils 等效工具具有稍微友好的界面
# determine a file's MIME type $ mimetype photo.jpeg photo.jpeg: image/jpeg # choose the default application for this file $ mimeopen -d photo.jpeg Please choose an application 1) Feh (feh) 2) GNU Image Manipulation Program (gimp) 3) Pinta (pinta) use application # # open a file with its default application $ mimeopen -n photo.jpeg
最重要的是,如果 xdg-utils 程序未检测到您的 桌面环境,它们实际上会调用 file
而不是 mimetype
进行 MIME 类型检测。 这很重要,因为 file
不遵循 XDG 标准。
mimeo
mimeoAUR 提供了工具 mimeo
,它统一了 xdg-open
和 xdg-mime
的功能。
在以下示例中,我们看到如何将 SVG 文件与 Inkscape 关联
# determine a file's MIME type $ mimeo --mimetype Svg_example2.svg Svg_example2.svg image/svg+xml # determine desktop file associated with executable "inkscape" $ mimeo --app2desk inkscape inkscape org.inkscape.Inkscape.desktop # find desktop file path $ mimeo --finddesk org.inkscape.Inkscape.desktop /usr/share/applications/org.inkscape.Inkscape.desktop # choose the default application for this MIME type $ mimeo --prefer image/svg+xml org.inkscape.Inkscape.desktop # check association $ mimeo --mime2desk image/svg+xml image/svg+xml org.inkscape.Inkscape.desktop # open a file with its default application $ mimeo Svg_example2.svg
也可以找到 mimeapps.list
文件的路径
$ mimeo --mimeapps-list /home/user/.config/mimeapps.list
然而,与 xdg-utils 的一个很大区别是,mimeo 还支持自定义“关联文件”,这些文件允许更复杂的关联。 例如,基于正则表达式匹配传递特定的命令行参数
# open youtube links in VLC without opening a new instance vlc --one-instance --playlist-enqueue %U ^https?://(www.)?youtube.com/watch\?.*v=
xdg-utils-mimeoAUR 补丁 xdg-utils,以便在未检测到桌面环境时,xdg-open
回退到 mimeo。
handlr
用 Rust 编写的 handlr-regex 提供了 xdg-open
和 xdg-mime
的功能,并具有简化的界面。 handlr-regex 是 handlrAUR 的一个分支,增加了正则表达式支持。
与 xdg-utils
相比,它包括
- 按扩展名设置关联,无需查找或记住 mime 类型
- mime 类型和扩展名的验证
- 从
mimeapps.list
中删除无效条目 - 在文件名不明确的情况下,智能检测文件内容的 mime 类型
- 自动完成 mimes、扩展名和桌面条目
- 基于正则表达式将任意命令设置为处理程序
# The following two are identical handlr set .png feh.desktop handlr set image/png feh.desktop # List default apps handlr list # Get the handler for a mime/extension $ handlr get .png --json {"handler":"pqiv.desktop","name":"pqiv","cmd":"/usr/bin/pqiv"} # Launch a handler with optional path/URL handlr launch x-scheme-handler/https handlr launch x-scheme-handler/https -- https://google.ca
要使用 handlr
作为 xdg-open
的替代品,请使用以下脚本对其进行 shadow
#!/usr/bin/bash handlr open "$@"
clifm
Lira,clifm
的内置资源打开器,可以通过 --open
命令行选项用作独立的资源打开器。 配置文件 (~/.config/clifm/profiles/PROFILE_NAME/mimelist.clifm
) 支持 MIME 类型和文件名(或文件扩展名)的正则表达式。 一些例子:
# Open a regular file clifm --open /etc/hosts # Open a directory clifm --open /media/data # Open an URL (via the application associated to the text/http MIME type in the configuration file) clifm --open www.archlinux.org
极简替代品
以下软件包与 xdg-utils 冲突并提供它,因为它们提供了自己的 /usr/bin/xdg-open
脚本。
如果您想使用这些资源打开器之一,同时仍然能够使用 xdg-utils,请在 /usr/bin
之前的 PATH 目录中手动安装它们。
- mimiAUR, mimi-gitAUR - 130 行 Bash 脚本,可以更改每种 MIME 类型的命令参数
- busking-gitAUR - 类似于 mimi 的 80 行 Perl 脚本,但也支持正则表达式规则
run-mailcap
xdg-open
有可能委托给它。 如果您正在使用来自 mailcap 的 /etc/mailcap
,这将导致无限循环,因为它也委托给 xdg-open
。