在读我的问题之前,请不要把它标记为重复。我知道这些问题已经存在,但现有的答案并不如预期的那样有效,这就是我提出这一问题的原因。
现有的答案是,设置默认文件管理器的方法是xdg-mime default inode/directory,使用默认文件管理器定位文件的方法是dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItems array:string:"" string:""。
但是,当我在一些基于Arch的发行版(包括使用Gnome的Arch)上测试这一点时,dbus-send命令在安装xdg-mime query default文件管理器( Gnome的默认文件管理器是Gnome)之后,并不总是打开D3指示的文件管理器。当xdg-mime query default inode/directory输出nemo.desktop时,上面的dbus-send...命令打开Gnome文件,当前者输出"org.gnome.Nautilus.desktop“时,后者打开Nemo。(此时没有正在运行的文件管理器。如果已经有一个文件管理器的实例,则dbus-send命令似乎使用该文件管理器。)
上面的dbus-send命令是否是“使用默认文件管理器定位文件”的正确命令?虽然上面的dbus-send命令没有像预期的那样工作,但是JetBrain的IDE就像Android或IntellJ一样,当我右键单击一个文件,然后单击"Open“,然后单击文件管理器的名称时,JetBrain的IDE或IntellJ正确地定位了默认的文件管理器。我曾想过查看它们的源代码,但这些都是巨大的应用程序,试图搜索它们的源代码返回的结果(我使用了诸如"open“或”文件管理器“之类的关键字)。
发布于 2023-04-30 14:48:44
这两种配置之间没有任何关系,因为系统实际上没有统一的“默认文件管理器”概念。xdg-mime只更改MIME类型关联,但对程序试图通过D总线与org.freedesktop.FileManager1对话时激活什么服务没有任何影响。
(这有点像.html文件和http:// URL如何与不同的程序相关联。)
由于遗留的原因,dbus-守护进程允许多个.service文件声称它们提供了相同的服务名称。(这仅在激活尚未运行的服务时才重要;如果已经运行的进程已经声明了名称,则不使用激活。)
第一步可能是找出哪个D总线.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",ordA8/gse'
}
$ uri="file://$(urlencode "$path")"
$ gdbus call -e -d org.freedesktop.FileManager1 \
-o /org/freedesktop/FileManager1 \
-m org.freedesktop.FileManager1.ShowItems \
"['$uri']" \
"''"https://unix.stackexchange.com/questions/744254
复制相似问题