为什么 xdg-open 使用 Mendeley 作为 PDF 的默认值?

Rap*_*ael 5 defaults configuration mime-types xdg-open xdg

与这个问题类似,我有一些应用程序(Calibre、texdoc)使用 Mendeley 打开 PDF。从 Thunar、Thunderbird、Firefox 等打开 PDF 会打开 evince,这是预期的默认设置。

这些应用程序似乎使用了xdg-open

$ xdg-mime query default application/pdf
mendeleydesktop.desktop
Run Code Online (Sandbox Code Playgroud)

试图找到它的来源,但没有成功;我用它修复了

xdg-mime default evince.desktop application/pdf
Run Code Online (Sandbox Code Playgroud)

问题仍然是:xdg-openMendeley 应该成为默认 PDF 查看器的想法是从哪里来的?

我使用的是 Ubuntu 16.04 和 i3 4.11。xdg-open版本为 1.1.0 rc3。

Nat*_*ver 3

\n

问题仍然是:xdg-openMendeley 应该成为默认 PDF 查看器的想法从何而来?

\n
\n

这是一个非常合理的问题。\n这是一个有点长的答案,分为三个部分。

\n

选项 1:阅读文档

\n

例如,FreeDesktop 标准\非 mimetype 关联有这样的说法:

\n
\n

MIME 类型和应用程序之间的关联

\n

用户、系统管理员、应用程序供应商和发行版可以通过写入\n名为 mimeapps.list 的文件来更改应用程序和 mime 类型之间的关联。

\n

该文件的查找顺序如下:

\n
$XDG_CONFIG_HOME/$desktop-mimeapps.list            user overrides, desktop-specific (for advanced users)\n$XDG_CONFIG_HOME/mimeapps.list                     user overrides (recommended location for user configuration GUIs)\n$XDG_CONFIG_DIRS/$desktop-mimeapps.list            sysadmin and ISV overrides, desktop-specific\n$XDG_CONFIG_DIRS/mimeapps.list                     sysadmin and ISV overrides\n$XDG_DATA_HOME/applications/$desktop-mimeapps.list for completeness, deprecated, desktop-specific\n$XDG_DATA_HOME/applications/mimeapps.list          for compatibility, deprecated\n$XDG_DATA_DIRS/applications/$desktop-mimeapps.list distribution-provided defaults, desktop-specific\n$XDG_DATA_DIRS/applications/mimeapps.list          distribution-provided defaults\n
Run Code Online (Sandbox Code Playgroud)\n

在此表中,$desktop是当前桌面的名称之一,\n小写(例如 kde、gnome、xfce 等)

\n
\n

请注意,如果未设置XDG_CONFIG_HOME和等环境变量,它们将恢复为默认值XDG_DATA_HOME

\n
\n

$XDG_DATA_HOME定义应存储用户特定数据文件的相对基目录。如果$XDG_DATA_HOME未设置或为空,则应使用等于 $HOME/.local/share 的默认值。

\n

$XDG_CONFIG_HOME定义应存储用户特定配置文件的相对基目录。如果$XDG_CONFIG_HOME未设置或为空,$HOME/.config则应使用默认值等于。

\n
\n

这说明了 mimetype 关联最棘手的方面之一:\n它们可以在许多不同的位置设置,\n并且这些设置可能在不同的位置被覆盖。\n但是,~/.config/mimeapps.list我们应该使用它来设置我们自己的关联。

\n

这也与 GNOME 桌面的文档相匹配。

\n
\n

要覆盖单个用户的系统默认设置,您需要创建一个~/.config/mimeapps.list文件,其中包含您想要覆盖默认注册应用程序的 MIME 类型列表。

\n
\n

还有这个有用的花絮:

\n
\n

您可以使用 gio mime 命令来验证默认注册的应用程序是否已正确设置:

\n
$ gio mime text/html\nDefault application for \xe2\x80\x9ctext/html\xe2\x80\x9d: myapplication1.desktop\nRegistered applications:\n  myapplication1.desktop\n  epiphany.desktop\nRecommended applications:\n  myapplication1.desktop\n  epiphany.desktop\n
Run Code Online (Sandbox Code Playgroud)\n
\n

检查 mimetype 关联的跨平台命令是:

\n
xdg-mime query default application/pdf\n
Run Code Online (Sandbox Code Playgroud)\n

对于 GNOME,命令是:

\n
gio mime application/pdf\n
Run Code Online (Sandbox Code Playgroud)\n

对于 KDE Plasma,命令是:

\n
ktraderclient5 --mimetype application/pdf\n
Run Code Online (Sandbox Code Playgroud)\n

当我查看我的~/.config/mimeapps.list文件时,\nit 看起来像这样:

\n
[Added Associations]\napplication/epub+zip=calibre-ebook-viewer.desktop;org.gnome.FileRoller.desktop;\n<snip>\napplication/pdf=evince.desktop;qpdfview.desktop;okularApplication_pdf.desktop;<snip>\n<snip>\n[Default Applications]\napplication/epub+zip=calibre-ebook-viewer.desktop\n<snip>\napplication/pdf=evince.desktop;\n
Run Code Online (Sandbox Code Playgroud)\n

application/pdf您可以看到under下只有一个条目[Default Applications];\nsoevince.desktop是 PDF 文件的默认处理程序。\n我没有安装 Mendeley,但使其成为默认 PDF 处理程序的一种方法\nis 将其桌面文件放在这里而不是evince.desktop

\n

请注意,我们相信此处的文档~/.config/mimeapps.list是正确的文件;我们实际上并不能确定这一点。\n我们将在第 3 部分中再次讨论这一点。

\n

选项2:阅读源代码。

\n

xdg-open是一个 shell 脚本,其行为\n取决于 的值$XDG_CURRENT_DESKTOP。\n您可以在此处查看其工作原理

\n
if [ -n "${XDG_CURRENT_DESKTOP}" ]; then\n  case "${XDG_CURRENT_DESKTOP}" in\n     # only recently added to menu-spec, pre-spec X- still in use\n     Cinnamon|X-Cinnamon)\n       DE=cinnamon;\n       ;;\n     ENLIGHTENMENT)\n       DE=enlightenment;\n       ;;\n     # GNOME, GNOME-Classic:GNOME, or GNOME-Flashback:GNOME\n     GNOME*)\n       DE=gnome;\n       ;;\n     KDE)\n       DE=kde;\n       ;;\n
Run Code Online (Sandbox Code Playgroud)\n

由于您正在使用i3,\nDE变量将被设置为generic,并且脚本将调用\nitopen_generic()函数,\n该函数将依次调用 或run-mailcapmimeopen\n,具体取决于安装的内容。

\n

请注意,您可以通过设置 来获取一些额外的信息\n XDG_UTILS_DEBUG_LEVEL,例如

\n
XDG_UTILS_DEBUG_LEVEL=4 xdg-open ~/path/to/example.pdf\n
Run Code Online (Sandbox Code Playgroud)\n

然而,调试信息对于我们的目的来说并没有那么丰富。

\n

选项 3:跟踪打开的文件。

\n

根据之前的调查,\n我们知道 mimetype 关联存储在硬盘驱动器上某个位置的文件中,\n而不是作为环境变量或dconf设置。\n这意味着我们不必依赖文档,\n我们可以使用它strace来确定该xdg-open命令实际打开哪些文件。\napplication/pdf对于 mimetype,我们可以使用:

\n
strace -f -e trace=open,openat,creat -o strace_log.txt xdg-open /path/to/example.pdf\n
Run Code Online (Sandbox Code Playgroud)\n

-f是为了跟踪子进程,因为xdg-open它本身并不能完成所有事情。

\n

-e trace=open,openat,creat跟踪系统调用openopenatcreat。\n这些来自man 2 openonline 的手册页。

\n

-o strace_log.txt是保存到日志文件以供稍后检查。

\n

输出有点庞大,\n但我们可以忽略\n的行,因为ENOENT (No such file or directory)这些文件不存在。

\n

您还可以使用其他命令,例如xdg-mimegio mime。\n我发现gio mime在我的主目录中读取这些文件:

\n
    \n
  • ~/.local/share//mime/mime.cache
  • \n
  • ~/.config/mimeapps.list
  • \n
  • ~/.local/share/applications
  • \n
  • ~/.local/share/applications/mimeapps.list
  • \n
  • ~/.local/share/applications/defaults.list
  • \n
  • ~/.local/share/applications/mimeinfo.cache
  • \n
\n

它还读取这些系统级文件:

\n
    \n
  • /usr/share/mime/mime.cache
  • \n
  • /usr/share/applications/defaults.list
  • \n
  • /usr/share/applications/mimeinfo.cache
  • \n
  • /var/lib/snapd/desktop/applications
  • \n
  • /var/lib/snapd/desktop/applications/mimeinfo.cache
  • \n
\n

要寻找application/pdf关联,这应该可以解决问题:

\n
grep \'application/pdf\' ~/.local/share//mime/mime.cache ~/.config/mimeapps.list ~/.local/share/applications ~/.local/share/applications/mimeapps.list ~/.local/share/applications/defaults.list ~/.local/share/applications/mimeinfo.cache /usr/share/mime/mime.cache /usr/share/applications/defaults.list /usr/share/applications/mimeinfo.cache /var/lib/snapd/desktop/applications /var/lib/snapd/desktop/applications/mimeinfo.cache | less\n
Run Code Online (Sandbox Code Playgroud)\n

从这里您可以看到 Mendeley 的桌面文件被添加到哪里。

\n
\n

我有一些应用程序(Calibre、texdoc)使用 Mendeley 打开 PDF。从 Thunar、Thunderbird、Firefox 等打开\nPDF 文件会打开 evince,这是预期的\n默认设置。

\n
\n

Firefox 和 Thunderbird 有自己的默认应用程序设置。\n我相信texdoc依赖于xdg-open。\n我不确定 Thunar,\n但我怀疑它依赖于xdg-open

\n

所以最终这可能是由于:

\n
    \n
  • xdg-open与 上的其他应用程序相比具有不同的后备i3;和

    \n
  • \n
  • Mendeley 的安装程序在某些文件中添加 mimetype 关联,但在其他文件中不添加。

    \n
  • \n
\n

附录:xdg-open不应mimeinfo.cache在 上使用该文件i3,\n但如果您需要重新生成它,请使用以下命令:

\n
update-desktop-database ~/.local/share/applications\n
Run Code Online (Sandbox Code Playgroud)\n

这是文档:

\n
\n

缓存 MIME 类型

\n

为了降低解析所有桌面文件的成本,提供了一个更新桌面数据库程序来生成缓存文件。这个概念与“update-mime-database”程序的概念相同,\n它可以让应用程序避免读入(可能)数百个文件。安装每个桌面文件后都需要运行它。为 $XDG_DATA_DIRS/applications/ 中的每个目录创建一个\n缓存文件,\n并将创建一个名为 $XDG_DATA_DIRS/applications/mimeinfo.cache 的文件。

\n
\n

https://specifications.freedesktop.org/desktop-entry-spec/0.9.5/ar01s07.html

\n

有关的:

\n\n