在 KDE 中将 Nemo 设为默认文件管理器后,浏览器仍调用 Dolphin 的解决方案

15 阅读2分钟

在 KDE 中将 Nemo 设为默认文件管理器后,浏览器仍调用 Dolphin 的解决方案

📋 问题描述

  • 操作系统:Debian 13 (KDE Plasma)
  • 目标:将系统默认文件管理器从 Dolphin 改为 Nemo
  • 现象
    • 执行 xdg-open ~/ 已正确调用 Nemo
    • KDE 系统设置中已将默认文件管理器改为 Nemo
    • 但 Firefox、Chrome 等浏览器点击“打开包含文件夹”时,仍然打开 Dolphin

🔍 排查过程

  1. 验证 xdg-open 行为
    xdg-open ~/ 正确打开 Nemo,说明传统 MIME 类型关联 (inode/directory) 配置正确。

  2. 测试 D-Bus 文件管理器接口
    该命令打开了 Dolphin,而非 Nemo。

    gdbus call --session --dest org.freedesktop.FileManager1 \
      --object-path /org/freedesktop/FileManager1 \
      --method org.freedesktop.FileManager1.ShowFolders "['file:///home/user']" ""
    
  3. 测试 KDE 原生调用
    kde-open ~/ 正确打开 Nemo,说明 KDE 自身配置正确。

  4. 根本原因
    现代浏览器(Firefox、Chrome 等)在 KDE 环境下不通过 xdg-open,而是直接调用 D-Bus 的 org.freedesktop.FileManager1 接口
    系统中存在两个文件管理器对该接口的服务注册:

    • Dolphin 的服务文件:/usr/share/dbus-1/services/org.kde.dolphin.FileManager1.service
    • Nemo 的服务文件:/usr/share/dbus-1/services/nemo.FileManager1.service
      由于 D-Bus 按文件名顺序加载服务,org.kde... 优先于 nemo...,导致 Dolphin 始终被选中。

参考文章

这两篇文章分别指出了 D-Bus 接口 org.freedesktop.FileManager1 的优先级问题以及浏览器直接调用该接口的行为,为定位问题提供了重要思路。

✅ 最终解决方案

核心思想:在用户级 D-Bus 服务目录中创建一个优先级更高的符号链接,让 Nemo 的服务文件被最先加载,从而覆盖 Dolphin 的注册。

操作步骤(一条命令)

bash

ln -sf /usr/share/dbus-1/services/nemo.FileManager1.service \
  ~/.local/share/dbus-1/services/00-nemo.FileManager1.service && \
  systemctl --user restart dbus

原理说明

  • ~/.local/share/dbus-1/services/ 是用户级 D-Bus 服务目录,其优先级高于系统目录 /usr/share/dbus-1/services/
  • D-Bus 会扫描所有目录下的 .service 文件,按文件名顺序加载第一个匹配的服务名称。
  • 符号链接以 00- 开头,确保 org.freedesktop.FileManager1 服务指向 Nemo 并最先被注册,Dolphin 的注册随后被忽略。

验证是否生效

bash

gdbus call --session --dest org.freedesktop.FileManager1 \
  --object-path /org/freedesktop/FileManager1 \
  --method org.freedesktop.FileManager1.ShowFolders "['file:///home/user']" ""

现在应只打开一个 Nemo 窗口,且 Firefox、Chrome 的“打开包含文件夹”也正常调用 Nemo。

恢复原状(如需撤销)

bash

rm ~/.local/share/dbus-1/services/00-nemo.FileManager1.service && \
  systemctl --user restart dbus

📌 总结

  • 根本原因:浏览器使用 D-Bus 的 org.freedesktop.FileManager1 接口,而非 xdg-open

  • 直接原因:Dolphin 的服务文件优先级高于 Nemo。

  • 解决方式:利用用户级 D-Bus 服务目录 + 文件名排序,强制 Nemo 优先注册。

该方案已在 Debian 13 KDE6 + Nemo 环境下验证通过。