ranger
関連記事
ranger は Python で書かれているテキストベースのファイルマネージャです。ディレクトリは3つのカラムに分けて表示されます。キーストロークやブックマーク、マウスやコマンド履歴を使ってディレクトリを移動することができます。選択したファイルは自動的にプレビューが表示されディレクトリは中身が表示されます。
ranger の特徴: vi スタイルのキーバインド、ブックマーク、選択、タグ、タブ、コマンド履歴、シンボリックリンクを作成可能、複数あるコンソールモード、タスク表示。ranger のコマンドやキーバインドはカスタマイズすることができ、外部スクリプトを呼び出すこともできます。よく似たファイルマネージャに Vifm があり、2つのペインと vi スタイルのキーバインドを使用しますが、機能の数はやや劣ります。
インストール
ranger は公式リポジトリからインストールできます。開発版を使いたい場合は AUR から ranger-gitAUR をインストールしてください。
使用方法
ranger を起動するには、まずターミナルを起動して、そこから ranger を実行してください。
| キー | コマンド |
|---|---|
? |
マニュアルを開く、キーバインド・コマンド・設定を表示 |
l, Enter |
ファイルを起動 |
j, k |
現在のディレクトリ内のファイルを選ぶ |
h, l |
上または下の階層のディレクトリへ移動 |
設定
起動後、ranger は ~/.config/ranger ディレクトリを作成します。デフォルト設定をこのディレクトリにコピーしたいときは次のコマンドを実行してください:
ranger --copy-config=all
rc.conf- スタートアップコマンドとキーバインドcommands.py-:で起動するコマンドrifle.conf- 特定のファイルを起動した時に使われるアプリケーション
デフォルトファイルもロードされるので rc.conf にはデフォルトファイルとの差異部分だけを記述します。commands.py には、ファイル全体をインクルードしない場合、一番最初に以下の行を記述します:
from ranger.api.commands import *
作成したディレクトリ ~/.Trash/ に DD でファイルを移動するキーバインドを追加するには、~/.config/ranger/rc.conf に以下を追記します:
map DD shell mv -t /home/${USER}/.Trash %s
設定に関する詳細は man ranger を見て下さい。
ファイルをゴミ箱に移動
DD を使用してゴミ箱ディレクトリ ~/.local/share/Trash/files/ にファイルを移動するキーバインドを追加するには、設定ファイルを次のように変更します。
~/.config/ranger/rc.conf
...
map DD shell mv %s /home/${USER}/.local/share/Trash/files/
...
または、 glib2 パッケージで提供されている GIO コマンドラインツールを使用します。
map DD shell gio trash %s
ゴミ箱 の中を見たり、空にするには通常、 nautilus のようなグラフィカルファイルマネージャがサポートしていますが、 gio list trash:// というコマンドでゴミ箱の中を見て、 gio trash--empty というコマンドでゴミ箱を空にすることもできます。
コマンドの定義
上記の例の続きに、以下のエントリを ~/.config/ranger/commands.py に追加することでゴミ箱 (~/.Trash) を空にできます:
class empty(Command):
""":empty
Empties the trash directory ~/.Trash
"""
def execute(self):
self.fm.run("rm -rf /home/myname/.Trash/{*,.[^.]*}")
使用するには :empty と入力して Enter を押してください。タブ補完も使えます。
カラースキーム
~/.config/ranger に colorschemes サブフォルダを作成してください:
$ mkdir ~/.config/ranger/colorschemes
それから新しい newscheme.py を上記のフォルダにコピーします。~/.config/ranger/rc.conf ファイルからデフォルトカラースキームを変更してください:
set colorscheme newscheme
ファイルプレビューでのカラーハイライト
python-pygments パッケージをインストールし、 /usr/share/doc/ranger/config/scope.sh を ~/.config/ranger/scope.sh にコピーして、 ranger の設定ファイル内の変数 PYGMENTIZE_STYLE を必要に応じて編集します。サポートされているテーマの完全なリストは pygmentize -L style から取得できます。
ファイルの関連付け
~/.config/ranger/rifle.conf を編集してください。先の行が早く実行されるので、ファイルの先頭に追記するようにしてください。例えば、tex ファイルを kile で開くには以下のエントリを記述します:
ext tex = kile "$@"
xdg-utils で全てのファイルを開くようにするには:
has xdg-open, flag f = xdg-open "$1"
ヒントとテクニック
圧縮ファイル
以下のコマンドでは atool を使ってアーカイブの操作を行います。
アーカイブの解凍
次のコマンドは、選択したアーカイブ元のディレクトリへ抽出します。
import os
from ranger.core.loader import CommandLoader
class extract_here(Command):
def execute(self):
""" extract selected files to current directory."""
cwd = self.fm.thisdir
marked_files = tuple(cwd.get_selection())
def refresh(_):
cwd = self.fm.get_directory(original_path)
cwd.load_content()
one_file = marked_files[0]
cwd = self.fm.thisdir
original_path = cwd.path
au_flags = ['-x', cwd.path]
au_flags += self.line.split()[1:]
au_flags += ['-e']
self.fm.copy_buffer.clear()
self.fm.cut_buffer = False
if len(marked_files) == 1:
descr = "extracting: " + os.path.basename(one_file.path)
else:
descr = "extracting files from: " + os.path.basename(
one_file.dirname)
obj = CommandLoader(args=['aunpack'] + au_flags
+ [f.path for f in marked_files], descr=descr,
read=True)
obj.signal_bind('after', refresh)
self.fm.loader.add(obj)
圧縮
次のコマンドを使用すると、ユーザーは現在のディレクトリにあるいくつかのファイルをマークしてから :compress パッケージの名前 パッケージ名で圧縮できます。現在のディレクトリの名前を取得し、拡張子に圧縮形式を追加することにより、いくつかの圧縮形式の提案をサポートします。 atool をインストールする必要があります。インストールされていない場合、アーカイブを作成するときにエラーメッセージが表示されます。
import os
from ranger.core.loader import CommandLoader
class compress(Command):
def execute(self):
""" Compress marked files to current directory """
cwd = self.fm.thisdir
marked_files = cwd.get_selection()
if not marked_files:
return
def refresh(_):
cwd = self.fm.get_directory(original_path)
cwd.load_content()
original_path = cwd.path
parts = self.line.split()
au_flags = parts[1:]
descr = "compressing files in: " + os.path.basename(parts[1])
obj = CommandLoader(args=['apack'] + au_flags + \
[os.path.relpath(f.path, cwd.path) for f in marked_files], descr=descr)
obj.signal_bind('after', refresh)
self.fm.loader.add(obj)
def tab(self):
""" Complete with current folder name """
extension = ['.zip', '.tar.gz', '.rar', '.7z']
return ['compress ' + os.path.basename(self.fm.thisdir.path) + ext for ext in extension]
外付けドライブ
外付けドライブは udev や udisks で自動的にマウントさせることができます。gm (go, media) を押すことで /media にマウントされたドライブに簡単にアクセスできます。
隠しファイル
次のコマンドで隠しファイルの表示を切り替えることができます :set show_hidden! または :set show_hidden true を使用して隠しファイルを表示します。 これを永続的にするには、設定ファイルに追加します。
rc.conf
set show_hidden true
または、zh を押して隠しファイルを切り替えることもできます。
イメージのマウント
以下のコマンドではイメージのマウントに CDemu を使用し、仮想ドライブを特定の場所 (この例では '/media/virtualrom') にマウントするために autofs などのシステムを利用します。マウントパスはあなたの設定に合わせて変更するようにしてください。
ranger から cdemud 仮想ドライブにイメージをマウントするには、イメージファイルを選択してコンソールに ':mount' と入力します。実際のマウントには設定によって多少時間がかかるので、カスタムローダーを使ってマウントディレクトリがマウントされるまで待機してからタブ 9 で裏で開くようにします。
import os, time
from ranger.core.loader import Loadable
from ranger.ext.signals import SignalDispatcher
from ranger.ext.shell_escape import *
class MountLoader(Loadable, SignalDispatcher):
"""
Wait until a directory is mounted
"""
def __init__(self, path):
SignalDispatcher.__init__(self)
descr = "Waiting for dir '" + path + "' to be mounted"
Loadable.__init__(self, self.generate(), descr)
self.path = path
def generate(self):
available = False
while not available:
try:
if os.path.ismount(self.path):
available = True
except:
pass
yield
time.sleep(0.03)
self.signal_emit('after')
class mount(Command):
def execute(self):
selected_files = self.fm.thisdir.get_selection()
if not selected_files:
return
space = ' '
self.fm.execute_command("cdemu -b system unload 0")
self.fm.execute_command("cdemu -b system load 0 " + \
space.join([shell_escape(f.path) for f in selected_files]))
mountpath = "/media/virtualrom/"
def mount_finished(path):
currenttab = self.fm.current_tab
self.fm.tab_open(9, mountpath)
self.fm.tab_open(currenttab)
obj = MountLoader(mountpath)
obj.signal_bind('after', mount_finished)
self.fm.loader.add(obj)
現在のフォルダを新しいタブで開く
ホームを新しいタブで開くショートカットは2つ存在します (gn と Ctrl+n)。Ctrl+n のバインドを変更する場合:
rc.conf
map <c-n> eval fm.tab_new('%d')
PDF ファイルのプレビュー
PDF ファイルを画像に変換することで ranger で PDF ファイルをプレビューできます。Ranger は画像のプレビューを ~/.cache/ranger/ に保存します。
まず、画像プレビューを有効化してください:
~/.config/ranger/rc.conf
# Use one of the supported image preview protocols set preview_images true
Ranger は w3m などを使って画像をプレビューします。利用可能な方法については ~/.config/ranger/rc.conf を見てください。
そして、以下の pdf プレビューコマンドを追加してください:
~/.config/ranger/scope.sh
# Image previews, if enabled in ranger.
if [ "$preview_images" = "True" ]; then
case "$mimetype" in
application/pdf)
pdftoppm -jpeg -singlefile "$path" "${cached//.jpg}" && exit 6;;
esac
fi
上記の例では poppler の pdftoppm ユーティリティを使って画像プレビューを作成しています。ghostscript や imagemagick など他の方法も利用可能です。
シェルの小技
パスの同期
Ranger はシェル関数 /usr/share/doc/ranger/examples/bash_automatic_cd.sh を提供しています。ranger ではなく ranger-cd を実行すると、最後に閲覧したフォルダに自動的に cd されます。
グラフィカルランチャーから Ranger を起動した場合 ($TERMCMD -e ranger など、TERMCMD は X ターミナル)、ranger-cd は使えません。実行可能属性を付与したスクリプトを作成して:
ranger-launcher.sh
#!/bin/sh export RANGERCD=true $TERMCMD
シェルの設定のできるだけ最後に以下を追加してください:
.shellrc
$RANGERCD && unset RANGERCD && ranger-cd
これで RANGERCD 変数が設定されている場合のみ ranger-cd が起動します。この変数を unset するようにしてください。そうしないとターミナルからサブシェルを起動したときに自動的に ranger が再起動してしまいます。
Ranger インスタンスのネスト防止
カレントディレクトリで S を使ってシェルを起動し、シェルを終了すると ranger インスタンスに戻ります。
しかし、既に ranger がシェルにいることを忘れて再び ranger を起動すると、ranger が ranger を実行している状態になってしまいます。
これを防ぐには、シェルスタートアップファイル に次の関数を作成します。
ranger() {
if [ -z "$RANGER_LEVEL" ]; then
/usr/bin/ranger "$@"
else
exit
fi
}
トラブルシューティング
画像のプレビューでブロックノイズ
カラムのボーダーをなくすと画像プレビューでストライプが見えることがあります [1]。~/.config/ranger/rc.conf に以下を設定:
set draw_borders true