跳至內容

默認應用程式

出自 Arch Linux 中文维基

這篇文章的某些內容需要擴充。

原因:向表格中添加更多應用程式。KDE 應用程式是否使用 QDesktopServices::openUrl?提及 exo-open(1)。 (在 Talk:默認應用程式 中討論)

程序以不同方式實現默認應用程式關聯。命令行程序通常使用環境變量,而圖形應用程式則傾向於通過 XDG MIME 應用程式,通過GIO API、Qt API或執行 /usr/bin/xdg-openxdg-utils 的一部分)來實現。由於 xdg-openXDG MIME 應用程式相當複雜,因此開發了各種替代的資源打開器。下表列出了每種方法的示例應用程式。

方法 使用 XDG 應用程式示例 檢查關聯
GIO 的 GAppInfo FirefoxGNOME 文件PCManFMThunarThunderbirdTelegram gio mime mimetype
/usr/bin/xdg-open 默認 Chromium(打開下載的文件) xdg-mime query default mimetype
自定義 通常沒有 mcranger
環境變量 mansudoeditsystemctl
D-Bus 的 FileManager1 org.freedesktop.FileManager1 Firefox(打開包含文件的文件夾)、Zotero(顯示文件)、Telegram(在文件夾中顯示)

許多桌面環境和圖形文件管理器提供了用於配置默認應用程式的圖形界面。

注意:XDG MIME 應用程式規範允許MIME類型定義文件對子類化和別名其他類型。這可能導致一些MIME類型的處理方式不明顯,其中應用程式並不直接支持目標類型,而是支持它的子類。例如,Firefox 可以通過 GIO 解析 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 mimiAURmimi-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 的對應工具有稍微更好的界面:

# 确定文件的 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 標準。

注意:perl-file-mimeinfo 在 0.28-1 版本之前並未完全遵循 XDG 標準。例如,它未能讀取跨發行版的默認設置,並且它將配置保存在被棄用的位置

mimeo[編輯 | 編輯原始碼]

mimeoAUR 提供了工具 mimeo,它統一了 xdg-openxdg-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-openxdg-mime 相同的功能,但界面更加簡潔。 handlr-regexhandlrAUR 的一個帶有正則表達式支持的分支。

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[編輯 | 編輯原始碼]

Liraclifm 內置的資源打開器,可以通過 --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[編輯 | 編輯原始碼]

警告:如果你使用 run-mailcapAURxdg-open 可能會將其委託給它。如果你使用來自 mailcap/etc/mailcap 文件,這將導致無限循環,因為它也會委託給 xdg-open