Site logo
devhx2.blog

GNOME ファイルマネージャー(Nautilus)の右クリックをカスタマイズするメモ

はじめに

Windows から Linux 環境に乗り換えてから、ファイルマネージャーの右クリック機能が貧弱に感じたのでカスタマイズした。そのときのメモ。

デスクトップ環境が GNOME かつファイルマネージャーが Nautilus であることを前提とする。

方法A: スクリプト方式

任意の Bash スクリプトを実行できる。

作成は簡単だが、実行にはデフォルトの右クリックメニュー直下に表示されず、「右クリック > スクリプト > [作成したスクリプト名]」と階層を辿らなければいけないのが不便。

また、ファイル・フォルダの右クリックには対応しているが、ファイルマネージャーの背景の右クリックには非対応。

  1. スクリプトファイル作成

    ~/.local/share/nautilus/scripts に拡張子なしのテキストファイルを作成する。

    ファイル名が右クリックメニューでの表示名となる。

スクリプトの例

  1. 右クリックで実行される bash スクリプトを書き込む

    bash
    #!/bin/bash
    # Zed でファイルを開くスクリプトの例
    zed "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"

    使える環境変数は以下の通り:

    • NAUTILUS_SCRIPT_SELECTED_FILE_PATHS 選択ファイルのパス
    • NAUTILUS_SCRIPT_SELECTED_URIS 選択ファイルの URI
    • NAUTILUS_SCRIPT_CURRENT_URI 現在開いているディレクトリの URI
  2. 右クリック -> メニューの スクリプト(S) から実行

スクリプトの実行例

方法B: Python 拡張方式

Nautilus の拡張機能として Python でコードを書く。

スクリプト方式と違い右クリックから直接実行できるうえ、ファイルマネージャーの背景の右クリックに対応している。

  1. python3-nautilus をインストール

    必要であれば拡張機能をインストールする。

    Ubuntu 系

    bash
    sudo apt install python3-nautilus

    Arch 系

    bash
    sudo pacman -S python-nautilus
  2. Python スクリプト作成

    ~/.local/share/nautilus-python/extensions に Python スクリプトを作成する。

    Python スクリプトの例

  3. 右クリックで実行される Python スクリプトを書き込む

    python
    import subprocess
    from urllib.parse import unquote
    
    # エディタ上ではインポートの警告がでるが動作はする
    from gi.repository import GObject, Nautilus
    
    # Nautilus.MenuProvider を実装するクラス
    class ZedMenuProvider(GObject.GObject, Nautilus.MenuProvider):
        # ファイル/フォルダ選択時
        def get_file_items(self, *args):
            files = args[-1]  # Nautilus のバージョンによって引数の数が異なるため末尾を使う
            item = Nautilus.MenuItem(
                name="ZedExtension::OpenInZed",  # 一意なID(拡張名::アクション名)
                label="Zedで開く",  # メニューに表示される文字列
            )
    
            # メニュー項目がクリックされたときに発火するシグナル
            item.connect("activate", self._open, files)
            return [item]
    
        # 背景右クリック時(現在のフォルダ)
        def get_background_items(self, *args):
            folder = args[-1]
            item = Nautilus.MenuItem(
                name="ZedExtension::OpenFolderInZed",
                label="このフォルダをZedで開く",
            )
    
            item.connect("activate", self._open_folder, folder)
            return [item]
    
        def _open(self, menu, files):
            # get_uri() は "file:///home/user/foo" 形式で返すので、ローカルパス用に file:// を削除
            # unquote() で URL エンコードされた部分をデコード
            paths = [unquote(f.get_uri().replace("file://", "")) for f in files]
    
            # 子プロセスを起動して即リターンするために Popen
            subprocess.Popen(["zed"] + paths)
            # -> ["zed", "/home/user/foo.txt", "/home/user/bar.txt"]
    
        def _open_folder(self, menu, folder):
            path = unquote(folder.get_uri().replace("file://", ""))
            subprocess.Popen(["zed", path])
            # -> ["zed", "/home/user/current_directory"]
  4. nautilus -q でフォルダマネージャーを再起動して、右クリックから直接実行

    ファイルを作っただけでは登録されないので、以下のコマンドでプロセスを完全に終了させて拡張機能を再読み込みさせる必要がある。

    bash
    nautilus -q

    Python スクリプトの実行例(ファイルクリック)

    Python スクリプトの実行例(背景クリック)

使い分け

特徴方法A: スクリプト方式方法B: Python 拡張方式
難易度低(Bashの知識のみ)中(Pythonとライブラリの知識)
メニュー階層深い(スクリプト経由)浅い(直下に表示可能)
背景クリック非対応対応
おすすめ手軽に自動化したい時UIにこだわりたい時

個人的には Python の方をおすすめする。

というのも、実行までにワンテンポ挟まるのは非常に不便だからだ。

また、上記の例のように任意のコマンドも Python から呼び出せるのでスクリプト実行のメリットはあまりない。

関連リソース

GNOME/Files - ArchWiki

wiki.archlinux.org

Nautilus.MenuProvider: nautilus-python Reference Manual

gnome.pages.gitlab.gnome.org