ranger
関連記事
ranger は Python で書かれているテキストベースのファイルマネージャです。ディレクトリは3つのカラムに分けて表示されます。キーストロークやブックマーク、マウスやコマンド履歴を使ってディレクトリを移動することができます。選択したファイルは自動的にプレビューが表示されディレクトリは中身が表示されます。
ranger の特徴: vi スタイルのキーバインド、ブックマーク、選択、タグ、タブ、コマンド履歴、シンボリックリンクを作成可能、複数あるコンソールモード、タスク表示。ranger のコマンドやキーバインドはカスタマイズすることができ、外部スクリプトを呼び出すこともできます。よく似たファイルマネージャに Vifm があり、2つのペインと vi スタイルのキーバインドを使用しますが、機能の数はやや劣ります。
インストール
ranger は公式リポジトリからインストールできます。開発版を使いたい場合は AUR から ranger-gitAUR をインストールしてください。
使用方法
ranger を起動するには、まずターミナルを起動して、そこから ranger
を実行してください。
キー | コマンド |
---|---|
? |
マニュアルを開く、キーバインド・コマンド・設定を表示 |
l , Enter |
ファイルを起動 |
設定
起動後、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 を見て下さい。
コマンドの定義
上記の例の続きに、以下のエントリを ~/.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
ファイルの関連付け
~/.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
にマウントされたドライブに簡単にアクセスできます。
イメージのマウント
以下のコマンドではイメージのマウントに 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つ存在します (g
n
と 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 からシェルを起動
With the previous method you can switch to a shell in last browsed path simply by leaving ranger. However you may not want to quit ranger for several reasons (numerous opened tabs, copy in progress, etc.).
You can start a shell from ranger (S
by default) without losing your ranger session. Unfortunately, the shell will not switch to the current folder automatically. Again, this can be solved with an executable script:
shellcd
#!/bin/sh export AUTOCD="$(realpath "$1")" $SHELL
and - as before - add this to at the very end of your shell configuration:
shellrc
cd "$AUTOCD"
Now you can change your shell binding for ranger:
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