长话短说:

长话短说:

长话短说:

在 Debian 中xdg-open(通过xdg-mime)不遵循我更喜欢使用mailcap的规范。run-mailcap有没有一些系统的方法来xdg-open跟踪mailcap条目?理想情况下,比修改xdg-open脚本以始终调用更简单run-mailcap

语境

Debian(从 9.5stretch 开始)有几个用于设置默认应用程序的系统,或者更具体地说,关联文件扩展名、MIME 类型和程序(或程序操作)。对它们进行了简要回顾在这个答案中。具有最大粒度(就 MIME 关联而言)的两个主要是

  1. 针对桌面环境的“更现代”XDG 标准
  2. mailcap系统更多地针对邮件代理和终端环境(或与桌面无关)。描述得很好在这个答案中

目标

我更喜欢使用第二个 mailcap 系统,因为它的通配符mailcap.order方法可以非常方便地自动将应用程序与其支持的所有(或子集)MIME 类型关联起来,并且还可以区分给定 MIME 类型的查看者和编辑者。该系统还与系统更新紧密结合,即更新软件包不会改变关联顺序。

执行入口点

上面提到的两种方法有不同的入口点

  1. XDG用途xdg-open
  2. mailcap 系统使用run-mailcap或其别名 ( view, edit)

但是,不同的程序调用不同的入口点,因此结果可能不一致。不过我正在努力实现这一目标。

xdg-open可能会退回到run-mailcap

经过检查,似乎/usr/bin/xdg-open会尝试使用桌面是否处于活动状态(在非常一般的意义上,不一定是桌面环境),否则它可能会回退到可用的情况。xdg-utils-1.1.1-1+deb9u1xdg-openxdg-mimerun-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在脚本中插入确定):

  1. xdg-open调用xdg-mime query filetype file.pdf以确定其 MIME 类型是application/pdf
  2. 然后它会查询xdg-mime是否有该 MIME 类型的默认应用程序。
  3. 由于我没有实际的关联,它开始寻找*.dekstop支持该 MIME 类型的条目。对于每个*.desktop文件,它都会查看该InitialPreference字段以确定一个好的候选者。
  4. 恰巧libreoffice-draw.desktopinitialPreference=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实现。

相关内容