/home/amgsk

VSCodeのOpen Containing FolderでThunarを起動する

· amgsk

VSCodeでファイルを右クリックして Open Containing Folder を実行すると、なぜか Gnome Nautilus が立ち上がってしまう現象に遭遇した。 普段のファイルマネージャーには Thunar を使っており、~/.config/mimeapps.list でもちゃんと以下のように設定済みのはずだった。

~/.config/mimeapps.list
1
2
[Default Applications]
inode/directory=thunar.desktop

xdg-mime のクエリでも正しく Thunar が返ってくる。

1
2
xdg-mime query default inode/directory
# => thunar.desktop

それなのに Nautilus が起動する。何故?

VSCode (Electron) は D-Bus 経由でファイルマネージャーを呼ぶみたい

調べてみると、VSCode(というか Electron)の showItemInFolderxdg-mime や mimeapps.list を見ないということが分かった。 代わりに D-Bus の org.freedesktop.FileManager1 インターフェース経由でファイルマネージャーを呼び出している。これは mimeapps.list とは完全に別経路。

そしてシステム標準では以下のサービスファイルが配置されており、こいつが Nautilus を起動する定義になっている。

1
cat /usr/share/dbus-1/services/org.freedesktop.FileManager1.service
/usr/share/dbus-1/services/org.freedesktop.FileManager1.service
1
2
3
[D-BUS Service]
Name=org.freedesktop.FileManager1
Exec=/usr/bin/nautilus --gapplication-service

mimeapps.list 側でいくら Thunar を指定しても、VSCode は D-Bus を叩いて Nautilus を起動してくるという罠だった。

ユーザーローカルにサービスファイルを置いて上書きすることで解決

D-Bus のサービスファイルは、ユーザーローカル(~/.local/share/dbus-1/services/)がシステム(/usr/share/dbus-1/services/)より優先される。 なので同名のサービスファイルを Thunar 起動定義で配置すれば上書き出来る。

1
mkdir -p ~/.local/share/dbus-1/services
~/.local/share/dbus-1/services/org.freedesktop.FileManager1.service
1
2
3
[D-BUS Service]
Name=org.freedesktop.FileManager1
Exec=/usr/bin/Thunar --gapplication-service

これで VSCode の Open Containing Folder でちゃんと Thunar が起動するようになった。

余談

/usr/share/dbus-1/services/ を直接書き換える方法もあるが、パッケージ更新で上書きされて元に戻る可能性があるので、ユーザーローカルに置く方が安全。 同じやり方は、他のアプリ(Discord, Slack 等の Electron 製アプリ全般)でも有効なはず。

ファイルマネージャー周りの「設定したのに効かない」現象は、xdg-mime / D-Bus / GVfs / それぞれのアプリ独自の設定 … と複数のレイヤーが絡んでくるので、一筋縄では行かない事が多くて困る。

EOF