GNOME ファイルマネージャー(Nautilus)の右クリックをカスタマイズするメモ
はじめに
Windows から Linux 環境に乗り換えてから、ファイルマネージャーの右クリック機能が貧弱に感じたのでカスタマイズした。そのときのメモ。
デスクトップ環境が GNOME かつファイルマネージャーが Nautilus であることを前提とする。
方法A: スクリプト方式
任意の Bash スクリプトを実行できる。
作成は簡単だが、実行にはデフォルトの右クリックメニュー直下に表示されず、「右クリック > スクリプト > [作成したスクリプト名]」と階層を辿らなければいけないのが不便。
また、ファイル・フォルダの右クリックには対応しているが、ファイルマネージャーの背景の右クリックには非対応。
-
スクリプトファイル作成
~/.local/share/nautilus/scriptsに拡張子なしのテキストファイルを作成する。ファイル名が右クリックメニューでの表示名となる。
-
右クリックで実行される bash スクリプトを書き込む
bash#!/bin/bash # Zed でファイルを開くスクリプトの例 zed "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"使える環境変数は以下の通り:
NAUTILUS_SCRIPT_SELECTED_FILE_PATHS選択ファイルのパスNAUTILUS_SCRIPT_SELECTED_URIS選択ファイルの URINAUTILUS_SCRIPT_CURRENT_URI現在開いているディレクトリの URI
-
右クリック -> メニューの
スクリプト(S)から実行
方法B: Python 拡張方式
Nautilus の拡張機能として Python でコードを書く。
スクリプト方式と違い右クリックから直接実行できるうえ、ファイルマネージャーの背景の右クリックに対応している。
-
python3-nautilusをインストール必要であれば拡張機能をインストールする。
Ubuntu 系
bashsudo apt install python3-nautilusArch 系
bashsudo pacman -S python-nautilus -
Python スクリプト作成
~/.local/share/nautilus-python/extensionsに Python スクリプトを作成する。
Python スクリプトの例 -
右クリックで実行される Python スクリプトを書き込む
pythonimport 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"] -
nautilus -qでフォルダマネージャーを再起動して、右クリックから直接実行ファイルを作っただけでは登録されないので、以下のコマンドでプロセスを完全に終了させて拡張機能を再読み込みさせる必要がある。
bashnautilus -q
Python スクリプトの実行例(ファイルクリック)
Python スクリプトの実行例(背景クリック)
使い分け
| 特徴 | 方法A: スクリプト方式 | 方法B: Python 拡張方式 |
|---|---|---|
| 難易度 | 低(Bashの知識のみ) | 中(Pythonとライブラリの知識) |
| メニュー階層 | 深い(スクリプト経由) | 浅い(直下に表示可能) |
| 背景クリック | 非対応 | 対応 |
| おすすめ | 手軽に自動化したい時 | UIにこだわりたい時 |
個人的には Python の方をおすすめする。
というのも、実行までにワンテンポ挟まるのは非常に不便だからだ。
また、上記の例のように任意のコマンドも Python から呼び出せるのでスクリプト実行のメリットはあまりない。
関連リソース
GNOME/Files - ArchWiki
Nautilus.MenuProvider: nautilus-python Reference Manual