---
title: "GNOME ファイルマネージャー（Nautilus）の右クリックをカスタマイズするメモ"
draft: false
publish: 2026-05-02
description: "Windows から Linux 環境に乗り換えてから、ファイルマネージャーの右クリック機能が貧弱に感じたのでカスタマイズした。そのときのメモ。"
tags: ["Linux", "Bash", "Python"]
---

## はじめに

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

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

## 方法A: スクリプト方式

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

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

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

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

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

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

![](gnome-explorer-script-file.png "スクリプトの例")

2. 右クリックで実行される 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

3. 右クリック -> メニューの `スクリプト(S)` から実行

![](gnome-explorer-click-script.png "スクリプトの実行例")

## 方法B: Python 拡張方式

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

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

0. `python3-nautilus` をインストール

    必要であれば拡張機能をインストールする。
    
    Ubuntu 系
    ```bash
    sudo apt install python3-nautilus
    ```

    Arch 系
    ```bash
    sudo pacman -S python-nautilus
    ```

1. Python スクリプト作成

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

    ![](gnome-explorer-python-file.png "Python スクリプトの例")

2. 右クリックで実行される 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"]
    ```

3. `nautilus -q` でフォルダマネージャーを再起動して、右クリックから直接実行

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

    ```bash
    nautilus -q
    ```

    ![](gnome-explorer-click-python.png "Python スクリプトの実行例(ファイルクリック)")
    
    ![](gnome-explorer-click-python2.png "Python スクリプトの実行例(背景クリック)")

## 使い分け

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

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

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

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

## 関連リソース

[](https://wiki.archlinux.org/title/GNOME/Files#Custom_scripts)

[](https://gnome.pages.gitlab.gnome.org/nautilus-python/class-nautilus-python-menu-provider.html)
