如同这个问题,我有一些应用程序(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-open
Mendeley 应该成为默认 PDF 查看器的想法是从哪里来的?
我使用的是 Ubuntu 16.04 和 i3 4.11。xdg-open
版本为 1.1.0 rc3。
答案1
问题仍然是:
xdg-open
Mendeley 应该成为默认 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_HOME
和XDG_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/pdf
mimetype,我们可以使用这个:
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
是仅跟踪系统调用open
、openat
和creat
。这些来自手册页man 2 open
或的手册页在线的。
这-o strace_log.txt
是保存到日志文件以供稍后检查。
输出有点庞大,但我们可以忽略这些行,ENOENT (No such file or directory)
因为这些文件不存在。
您还可以使用其他命令,例如xdg-mime
或gio 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
有关的: