![设置默认文件管理器并使用默认文件管理器查找文件](https://linux22.com/image/219627/%E8%AE%BE%E7%BD%AE%E9%BB%98%E8%AE%A4%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E5%99%A8%E5%B9%B6%E4%BD%BF%E7%94%A8%E9%BB%98%E8%AE%A4%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E5%99%A8%E6%9F%A5%E6%89%BE%E6%96%87%E4%BB%B6.png)
在阅读我的问题之前,请不要将其标记为重复。我知道已经存在这些问题,但是现有的答案没有按预期工作,这就是我问这个问题的原因。
现有的答案说设置默认文件管理器的方法是xdg-mime default <app name> inode/directory
,并且使用默认文件管理器定位文件的方法是dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItems array:string:"<path>" string:""
。
但是,当我在一些基于 Arch 的发行版(包括 Arch with Gnome)上进行测试时,在安装 Nemo 文件管理器(Gnome 的默认文件管理器是 Gnome Files)后,该dbus-send
命令并不总是打开xdg-mime query default
指示的文件管理器。当xdg-mime query default inode/directory
输出时nemo.desktop
,dbus-send...
上面的命令打开了 Gnome Files,当前者输出“org.gnome.Nautilus.desktop”时,后者打开了 Nemo。 (这是在没有正在运行的文件管理器的情况下。如果已经存在文件管理器的实例,dbus-send
则命令似乎使用该文件管理器。)
dbus-send
上面的命令是“使用默认文件管理器查找文件”的正确命令吗?虽然dbus-send
上面的命令没有按预期工作,但当我右键单击文件,然后单击“打开方式”,然后单击文件管理器的名称时,JetBrain 的 IDE(例如 Android Studio 或 IntelllJ)使用默认文件管理器正确找到了文件。我想研究他们的源代码,但那些是巨大的应用程序并试图搜索他们的源代码没有返回结果(我使用了“打开方式”或“文件管理器”等关键字)。
答案1
这两种配置彼此无关,因为系统并没有真正统一的“默认文件管理器”概念。xdg-mime
仅更改 MIME 类型关联,但对程序尝试org.freedesktop.FileManager1
通过 D-Bus 进行通信时激活的服务绝对没有影响。
(这有点像 .html 文件和 http:// URL 与不同程序关联的方式。)
由于遗留原因,dbus-daemon 允许多个.service
文件声明它们提供相同的服务名称。 (这仅在激活服务时才重要还没有跑步;如果该名称已被正在运行的进程声明,则不会使用激活。)
第一步可能是找出哪些 D-Bus .service 文件提供了名称:
$ grep -rl Name=org.freedesktop.FileManager1 /usr/share/dbus-1/services
/usr/share/dbus-1/services/org.kde.dolphin.FileManager1.service
/usr/share/dbus-1/services/org.xfce.Thunar.FileManager1.service
/usr/share/dbus-1/services/org.freedesktop.FileManager1.service
(不要介意文件名与它们明显提供的服务名称不匹配。)
然后通过以下方式覆盖不需要的服务~/.local/share/dbus-1
:
$ mkdir -p ~/.local/share/dbus-1/services
$ ln -s /dev/null ~/.local/share/dbus-1/services/org.xfce.Thunar.FileManager1.service
$ ln -s /dev/null ~/.local/share/dbus-1/services/org.kde.dolphin.FileManager1.service
实际上命名的那个org.freedesktop.FileManager1.service
恰好是 Nautilus,所以它可以留下来:
$ cat org.freedesktop.FileManager1.service
[D-BUS Service]
Name=org.freedesktop.FileManager1
Exec=/usr/bin/nautilus --gapplication-service
验证是否有效:
$ urlencode() {
echo -n "$1" | perl -pe's/[^\/A-Za-z0-9_.!~,=-]/sprintf"%%%02X",ord$&/gse'
}
$ uri="file://$(urlencode "$path")"
$ gdbus call -e -d org.freedesktop.FileManager1 \
-o /org/freedesktop/FileManager1 \
-m org.freedesktop.FileManager1.ShowItems \
"['$uri']" \
"''"