默认应用程序 - Arch Linux 中文维基

跳转到内容

# 默认应用程序

来自 Arch Linux 中文维基
翻译状态：

- 本文（或部分内容）译自 Default applications，最近一次同步于 2026-02-21，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

这篇文章的某些内容需要扩充。

原因：向表格中添加更多应用程序。KDE 应用程序是否使用 QDesktopServices::openUrl？提及 exo-open(1)。提及GTK 4.10 及更新版本通过 GtkUriLauncher API 使用的 xdg-document-portal 关联系统。 (在 Talk:默认应用程序 中讨论)

不同程序会使用不同的方式实现默认应用程序关联。命令行程序通常使用环境变量，而图形应用程序则倾向于通过调用 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（在文件夹中显示） | –

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

注意：XDG MIME 应用程序规范允许 MIME 类型定义为其它类型的子类型或别名。对于没有默认程序的子类型，这种处理方式可能不够直观⸺会使用其父类型的默认程序。例如，Firefox 可能通过 GIO 将 `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 规范。

注意：perl-file-mimeinfo包 不完全遵循 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

警告：如果使用 run-mailcapAUR，`xdg-open` 在未检测到桌面环境时可能将请求委托给它处理。若同时使用了 mailcap包 默认提供的 `/etc/mailcap`，由于该文件中的条目会调用 `xdg-open`，这将导致无限循环。
分类：​

- 系统管理

默认应用程序
添加话题