為什麼 xdg-open 使用 Mendeley 作為 PDF 的預設值?
與此問題類似,我有一些應用程序(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 查看器的想法是從哪裡來的?我正在使用帶有 i3 4.11 的 Ubuntu 16.04。
xdg-open
版本為 1.1.0 rc3。
問題仍然存在:
xdg-open
Mendeley 應該是預設 PDF 查看器的想法是從哪裡來的?這是一個非常合理的問題。這是一個分三個部分的有點長的答案。
選項 1:閱讀文件
例如,關於 mimetype 關聯的FreeDesktop 標準 有這樣的說法:
MIME 類型和應用程序之間的關聯
使用者、系統管理員、應用程序供應商和發行版可以通過寫入名為 mimeapps.list 的文件來更改應用程序和 mimetype 之間的關聯。
該文件的查找順序如下:
$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]
;evince.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,這是預期的預設設置。
Firefox 和 Thunderbird 有自己的預設應用程序設置。我相信
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/, and will create a file called $ XDG_DATA_DIRS/applications/mimeinfo.cache。
https://specifications.freedesktop.org/desktop-entry-spec/0.9.5/ar01s07.html
有關的: