默认应用程序

来自 ArchWiki

此文章或章节需要扩充。

原因: 向表格添加更多应用程序。 KDE 应用程序是否使用 QDesktopServices::openUrl? 提及 exo-open(1)。 提及 GTK 4.18 及更新版本使用的 xdg-document-portal 关联系统。(在 Talk:Default applications 中讨论)

程序以不同的方式实现默认应用程序关联。 虽然命令行程序传统上使用 环境变量,但图形应用程序倾向于通过 XDG MIME 应用程序,通过 GIO API、Qt API 或执行 /usr/bin/xdg-open(它是 xdg-utils 的一部分)来实现。 由于 xdg-openXDG MIME 应用程序 非常复杂,因此开发了各种替代的 资源打开器。 下表列出了每种方法的示例应用程序。

方法 使用 XDG 应用程序示例 检查关联
GIO 的 GAppInfo FirefoxGNOME FilesPCManFMThunarThunderbirdTelegram gio mime mimetype
/usr/bin/xdg-open 默认情况下 Chromium (打开下载的文件) xdg-mime query default mimetype
自定义 通常不是 mcranger
环境变量 mansudoeditsystemctl
D-Bus 的 FileManager1 org.freedesktop.FileManager1 Firefox (打开所在文件夹)、Zotero (显示文件)、Telegram (在文件夹中显示)

许多桌面环境和图形文件管理器提供了用于配置默认应用程序的 GUI。

注意: XDG MIME 应用程序规范允许 MIME 类型定义文件继承和别名其他类型。 这可能会导致某些 MIME 类型的处理不明显,在这些类型中,应用程序不直接支持目标类型,但支持它继承的类型。 例如,Firefox 可以通过 GIO 将 application/rss+xml 解析为最终由自身打开,这是因为该类型继承了 application/xml,而 Firefox 是该类型的默认处理程序。

背景信息

程序有时需要使用用户首选的应用程序打开文件或 URI。 要使用用户首选的应用程序打开文件,需要检测文件类型(通常使用文件名扩展名或 magic numbers 映射到 MIME 类型),并且需要有一个与文件类型关联的应用程序。

Heirloom UNIX 程序使用 mime.types 进行 MIME 类型检测,并使用 mailcap 进行应用程序关联。

资源打开器

  • XDG MIME Apps:实现 XDG MIME 应用程序 规范
  • 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-openxdg-utils 的一部分)实现了 XDG MIME 应用程序,并被许多程序使用。

由于 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 标准。

注意: 0.28-1 之前的 perl-file-mimeinfo不完全遵循 XDG 标准。 例如,它不读取 distribution-wide defaults,并且将其配置保存在 已弃用的位置

mimeo

mimeoAUR 提供了工具 mimeo,它统一了 xdg-openxdg-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-openxdg-mime 的功能,并具有简化的界面。 handlr-regexhandlrAUR 的一个分支,增加了正则表达式支持。

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 的替代品,请使用以下脚本对其进行覆盖

#!/usr/bin/bash
handlr open "$@"

clifm

Liraclifm 的内置资源打开器,可以通过 --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 脚本,但也支持 regex 规则

run-mailcap

警告: 如果您使用 run-mailcapAUR,则 xdg-open 可能委托给它。 如果您正在使用来自 mailcap/etc/mailcap,这将导致无限循环,因为它也委托给 xdg-open