长话短说:
在 Debian 中xdg-open
(通过xdg-mime
)不遵循我更喜欢使用mailcap
的规范。run-mailcap
有没有一些系统的方法来xdg-open
跟踪mailcap
条目?理想情况下,比修改xdg-open
脚本以始终调用更简单run-mailcap
。
语境
Debian(从 9.5stretch 开始)有几个用于设置默认应用程序的系统,或者更具体地说,关联文件扩展名、MIME 类型和程序(或程序操作)。对它们进行了简要回顾在这个答案中。具有最大粒度(就 MIME 关联而言)的两个主要是
- 针对桌面环境的“更现代”XDG 标准
- 旧
mailcap
系统更多地针对邮件代理和终端环境(或与桌面无关)。描述得很好在这个答案中。
目标
我更喜欢使用第二个 mailcap 系统,因为它的通配符mailcap.order
方法可以非常方便地自动将应用程序与其支持的所有(或子集)MIME 类型关联起来,并且还可以区分给定 MIME 类型的查看者和编辑者。该系统还与系统更新紧密结合,即更新软件包不会改变关联顺序。
执行入口点
上面提到的两种方法有不同的入口点
- XDG用途
xdg-open
- mailcap 系统使用
run-mailcap
或其别名 (view
,edit
)
但是,不同的程序调用不同的入口点,因此结果可能不一致。不过我正在努力实现这一目标。
xdg-open
可能会退回到run-mailcap
经过检查,似乎/usr/bin/xdg-open
会尝试使用桌面是否处于活动状态(在非常一般的意义上,不一定是桌面环境),否则它可能会回退到可用的情况。xdg-utils-1.1.1-1+deb9u1
xdg-open
xdg-mime
run-mailcap
# ... line 787 in /usr/bin/xdg-open
open_generic()
{
if is_file_url_or_path "$1"; then
local file="$(file_url_to_path "$1")"
check_input_file "$file"
if [ -n "$DISPLAY" ]; then
filetype=`xdg-mime query filetype "$file" | sed "s/;.*//"`
open_generic_xdg_mime "$file" "$filetype"
fi
if which run-mailcap 2>/dev/null 1>&2; then
run-mailcap --action=view "$file"
if [ $? -eq 0 ]; then
exit_success
fi
fi
# ...
不一致的具体例子
目标是让 Evince 作为 PDF、Djvu 等的默认查看器。
我evince:*/*
在/etc/mailcap.order
运行后(可能在更新包后自动)条目,update-mime
这样的条目application/pdf; evince %s; test=test -n "$DISPLAY"
将首先出现在/etc/mailcap
.因此,启动器可以run-mailcap
按照我的意愿使用 Evince。
但是,当某些东西使用 时xdg-open
,它将在 Libreoffice Draw 中打开 PDF。其原因是(通过set -x
在脚本中插入确定):
xdg-open
调用xdg-mime query filetype file.pdf
以确定其 MIME 类型是application/pdf
- 然后它会查询
xdg-mime
是否有该 MIME 类型的默认应用程序。 - 由于我没有实际的关联,它开始寻找
*.dekstop
支持该 MIME 类型的条目。对于每个*.desktop
文件,它都会查看该InitialPreference
字段以确定一个好的候选者。 - 恰巧
libreoffice-draw.desktop
有initialPreference=5
它使用它。
以下是带有调试信息的详细日志xdg-mime query default call
:
$ XDG_UTILS_DEBUG_LEVEL=3 xdg-mime query default application/pdf
Checking /home/$USER/.config/mimeapps.list
Checking /etc/xdg/mimeapps.list
Checking /home/$USER/.local/share/applications/mimeapps.list
Checking /usr/share//applications/mimeapps.list
Checking /home/$USER/.local/share/applications/defaults.list and
/home/$USER/.local/share/applications/mimeinfo.cache
Checking /home/$USER/.local/share/applications/defaults.list and
/home/$USER/.local/share/applications/mimeinfo.cache
Checking /usr/local/share//applications/defaults.list and
/usr/local/share//applications/mimeinfo.cache
Checking /usr/local/share//applications/defaults.list and
/usr/local/share//applications/mimeinfo.cache
Checking /usr/share//applications/defaults.list and
/usr/share//applications/mimeinfo.cache
Checking /usr/share//applications/defaults.list and
/usr/share//applications/mimeinfo.cache
Checking /home/$USER/.local/share/applications/wine-extension-pdf.desktop
Select /home/$USER/.local/share/applications/wine-extension-pdf.desktop
[ -1 => 0 ]
Checking /usr/share//applications/FoxitReader.desktop
Checking /usr/share//applications/evince.desktop
Checking /usr/share//applications/gimp.desktop
Checking /usr/share//applications/inkscape.desktop
Checking /usr/share//applications/libreoffice-draw.desktop
Select /usr/share//applications/libreoffice-draw.desktop [ 0 => 05 ]
Checking /usr/share//applications/mcomix.desktop
Checking /usr/share//applications/mupdf.desktop
Checking /usr/share//applications/pdf-presenter-console.desktop
Checking /usr/share//applications/vprerex.desktop
Checking /usr/share//applications/xpdf.desktop
Checking /usr/share//applications/zathura-pdf-poppler.desktop
libreoffice-draw.desktop
中的数字[ X => ]
是通过诸如 之类的调用获得的awk -F= /InitialPreference=/ {print($2)} /usr/share//applications/libreoffice-draw.desktop
,我通过将其放入脚本中来确定这set -x
一点xdg-mime
。
到目前为止建议的解决方法
以下是我到目前为止想到的解决方法。我正在寻找一些更好的、理想的更系统的解决方案。
一种选择是修改
xdg-open
脚本以始终回退到run-mailcap
.但这有点像黑客。即使我使用了dpkg-divert
,仍然意味着我必须自己维护它。使用 XDG 系统并将类似的内容
*/*:xdg-open
放入mailcap
.但可能会导致终端会话中的循环调用。
答案1
我xdg-open
也经常对各种限制感到困惑。
我在这里并不假装完整,但我正在使用以下桌面条目:
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
NoDisplay=true
Exec=run-mailcap %u
Name=run-mailcap
Comment=run-mailcap
并将所有内容委托给我的mimeapps.list
:
[Default Applications]
application/ogg=run-mailcap.desktop
application/pdf=run-mailcap.desktop
application/postscript=run-mailcap.desktop
application/rar=run-mailcap.desktop
application/rss+xml=run-mailcap.desktop
application/vnd.openxmlformats-officedocument.wordprocessingml.document=run-mailcap.desktop
application/x-cue=run-mailcap.desktop
application/x-extension-eml=run-mailcap.desktop
application/x-extension-htm=run-mailcap.desktop
application/x-extension-html=run-mailcap.desktop
application/x-extension-rss=run-mailcap.desktop
application/x-extension-xhtml=run-mailcap.desktop
application/x-ms-dos-executable=run-mailcap.desktop
application/x-xpinstall=run-mailcap.desktop
application/xhtml+xml=run-mailcap.desktop
application/xml=run-mailcap.desktop
application/xspf+xml=run-mailcap.desktop
application/zip=run-mailcap.desktop
audio/midi=run-mailcap.desktop
audio/prs.sid=run-mailcap.desktop
...
理论上,可以将此和/或您的自定义转移转换xdg-open
为虚拟xdg-utils
实现。