默認應用程式
不同程序會使用不同的方式實現默認應用程式關聯。命令行程序通常使用環境變量,而圖形應用程式則傾向於通過調用 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(在文件夾中顯示) | – |
許多桌面環境和圖形文件管理器提供用於配置默認應用程式的圖形界面。
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 規範。
- 在 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
xdg-open 在未檢測到桌面環境時可能將請求委託給它處理。若同時使用了 mailcap包 默認提供的 /etc/mailcap,由於該文件中的條目會調用 xdg-open,這將導致無限循環。