diff --git a/modules/applications/nautilus/home/nixos.nix b/modules/applications/nautilus/home/nixos.nix index b9a6318..26f65d4 100644 --- a/modules/applications/nautilus/home/nixos.nix +++ b/modules/applications/nautilus/home/nixos.nix @@ -1,14 +1,127 @@ { config, + lib, pkgs, ... }: +let + nautilusExtensionDir = "${pkgs.nautilus-python}/lib/nautilus/extensions-4"; +in { home.packages = [ pkgs.nautilus + pkgs.nautilus-python pkgs.sushi ]; + # Nautilus に nautilus-python のC拡張を認識させる。 + # home.sessionVariables: + # 通常のログインセッションやシェルから起動したNautilus向け + # + # systemd.user.sessionVariables: + # D-Bus/systemdユーザーサービス経由で起動したNautilus向け + home.sessionVariables.NAUTILUS_4_EXTENSION_DIR = nautilusExtensionDir; + + systemd.user.sessionVariables.NAUTILUS_4_EXTENSION_DIR = nautilusExtensionDir; + + xdg.dataFile."nautilus-python/extensions/open-in-editor.py".text = '' + import subprocess + + from gi.repository import GObject, Nautilus + + + class OpenInEditorExtension( + GObject.GObject, + Nautilus.MenuProvider, + ): + EDITORS = ( + ( + "vscode", + "VS Code で開く", + ["${lib.getExe pkgs.vscode}"], + ), + ( + "zed", + "Zed で開く", + ["${lib.getExe pkgs.zed-editor}"], + ), + ( + "neovim", + "Neovim で開く", + [ + "${lib.getExe pkgs.ghostty}", + "-e", + "${lib.getExe pkgs.neovim}", + ], + ), + ) + + @staticmethod + def get_local_paths(files): + paths = [] + + for file in files: + location = file.get_location() + + if location is None: + return [] + + path = location.get_path() + + if path is None: + return [] + + paths.append(path) + + return paths + + @staticmethod + def launch(_item, command): + subprocess.Popen( + command, + start_new_session=True, + close_fds=True, + ) + + def create_items(self, context, paths): + items = [] + + for editor_id, label, command in self.EDITORS: + item = Nautilus.MenuItem( + # 選択項目用と背景用で異なるIDにする + name=f"OpenInEditor::{context}::{editor_id}", + label=label, + ) + + item.connect( + "activate", + self.launch, + [*command, *paths], + ) + + items.append(item) + + return items + + def get_file_items(self, files): + paths = self.get_local_paths(files) + + if not paths: + return [] + + # 選択中のファイル・ディレクトリを渡す + return self.create_items("selection", paths) + + def get_background_items(self, current_folder): + paths = self.get_local_paths([current_folder]) + + if not paths: + return [] + + # 何も選択せず背景を右クリックした場合だけ現在位置を渡す + return self.create_items("background", paths) + ''; + dconf.settings = { "org/gnome/nautilus/preferences" = { always-use-location-entry = true;