选项 1:阅读文档

选项 1:阅读文档

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

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

$ xdg-mime query default application/pdf
mendeleydesktop.desktop

试图找到这是从哪里来的但不成功;我用它修复了

xdg-mime default evince.desktop application/pdf

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

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

答案1

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

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

选项 1:阅读文档

例如,免费桌面标准 关于 mimetype 关联有这样的说法:

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

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

该文件的查找顺序如下:

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

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

请注意,如果环境变量如XDG_CONFIG_HOMEXDG_DATA_HOME,将会恢复为默认值

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

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

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

这也符合GNOME 桌面文档

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

还有这个有用的花絮:

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

$ gio mime text/html
Default application for “text/html”: myapplication1.desktop
Registered applications:
  myapplication1.desktop
  epiphany.desktop
Recommended applications:
  myapplication1.desktop
  epiphany.desktop

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

xdg-mime query default application/pdf

对于 GNOME,命令是:

gio mime application/pdf

对于 KDE Plasma,命令是:

ktraderclient5 --mimetype application/pdf

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

[Added Associations]
application/epub+zip=calibre-ebook-viewer.desktop;org.gnome.FileRoller.desktop;
<snip>
application/pdf=evince.desktop;qpdfview.desktop;okularApplication_pdf.desktop;<snip>
<snip>
[Default Applications]
application/epub+zip=calibre-ebook-viewer.desktop
<snip>
application/pdf=evince.desktop;

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

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

选项2:阅读源代码。

xdg-open是一个 shell 脚本,其行为取决于 的值$XDG_CURRENT_DESKTOP。你可以看到这是如何运作的

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

由于您正在使用i3,该DE变量将被设置为generic并且脚本将调用它的open_generic()功能,这又会 根据安装的内容调用run-mailcap或。mimeopen

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

XDG_UTILS_DEBUG_LEVEL=4 xdg-open ~/path/to/example.pdf

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

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

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

strace -f -e trace=open,openat,creat -o strace_log.txt xdg-open /path/to/example.pdf

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

的目的-e trace=open,openat,creat是仅跟踪系统调用openopenatcreat。这些来自手册页man 2 open或的手册页在线的

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

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

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

  • ~/.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

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

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

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

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

火狐和雷鸟有他们自己的默认应用程序设置。我相信texdoc依靠xdg-open.我不确定 Thunar,但我怀疑它依赖于xdg-open.

所以最终这可能是由于:

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

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

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

update-desktop-database ~/.local/share/applications

这是文档:

缓存 MIME 类型

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

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

有关的:

相关内容