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 を見て下さい。
Move to trash
To add a keybind that moves files to your trash directory ~/.local/share/Trash/files/ with DD, amend the configuration file as follows:
~/.config/ranger/rc.conf
...
map DD shell mv %s /home/${USER}/.local/share/Trash/files/
...
Alternatively, use GIO commandline tool provided by glib2 package:
map DD shell gio trash %s
Inspecting and emptying the "trash" is normally supported by graphical file managers such as nautilus, but you can also see the trash with the command gio list trash://, and empty it with: 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 を使ってアーカイブの操作を行います。
アーカイブの解凍
以下のコマンドは圧縮ファイルをコピー (yy) して適切なディレクトリで :extracthere を実行します:
import os
from ranger.core.loader import CommandLoader
class extracthere(Command):
def execute(self):
""" Extract copied files to current directory """
copied_files = tuple(self.fm.copy_buffer)
if not copied_files:
return
def refresh(_):
cwd = self.fm.get_directory(original_path)
cwd.load_content()
one_file = copied_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(copied_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 copied_files], descr=descr)
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 からシェルを起動
前の方法を使用すると、最後に参照したパスのシェルに切り替えることができます。ただし、いくつかの理由(多くの開かれたタブ、進行中のコピーなど)のために ranger を終了したくない場合があります。ranger sessionを失うことなく、ranger(デフォルトではS)からシェルを開始できます。残念ながら、シェルは現在のフォルダーに自動的に切り替わりません。繰り返しますが、これは実行可能スクリプトで解決できます。
shellcd
#!/bin/sh export AUTOCD="$(realpath "$1")" $SHELL
前と同様に、シェル構成の最後にこれを追加します:
shellrc
cd "$AUTOCD"
これで、レンジャーのシェルバインディングを変更できます:
rc.conf
map S shell shellcd %d
もしくは、シェルの history ファイルを利用することもできます。例えば、zsh の場合:
shellcd
## Prepend argument to zsh dirstack. BUF="$(realpath "$1") $(grep -v "$(realpath "$1")" "$ZDIRS")" echo "$BUF" > "$ZDIRS" zsh
ZDIRS はあなたのディレクトリスタックに置き換えてください。
シンプルな方法
rc.conf
map S shell bash -c "cd %d; bash"
上記の設定は他のシェルでも使えます。(デフォルト設定のように) シェルを実行するかわりに、シェルの中で cd を実行してから、インタラクティブシェルを起動して使用できるようにしています。
ranger が現在のシェルで動いていない場合にのみ ranger の新しいインスタンスを起動
シェルのスタートアップファイルに以下を記述してください:
rg() {
if [ -z "$RANGER_LEVEL" ]
then
ranger
else
exit
fi
}
rg を実行して ranger を起動・復帰してください。
トラブルシューティング
画像のプレビューでブロックノイズ
カラムのボーダーをなくすと画像プレビューでストライプが見えることがあります [1]。~/.config/ranger/rc.conf に以下を設定:
set draw_borders true