CLI で Linux ファイルマネージャ ranger を使うことのメモ

シンプルで多機能、カスタマイザブルな Linux TUI ファイルマネージャ

マウスでやる GUI のファイルマネージャ(ファイル管理ソフト)はマウスだけでほとんどの事ができるし、片手だけでできてしまうのもいい。けれどオブジェクトにマウスカーソルを合わせて、という操作そのものは、軽快で素早いということとはベクトルが違うのではなかろうか。

それに対しコンソール版のファイルマネージャ(TUI ファイルマネージャ)は、マウスで使うものではないからこその操作体系に加えて、小サイズゆえの軽さと起動時間の早さとがあいまって、軽快である。

それらのひとつ、 ranger は vim ライクなキーバインディングのファイラーソフトだ。

ranger_filer_ss_preview_code.png

私はこの ranger をよく使っているけれど、使い込むうちに豊富な機能の使い方は整理しておくのがいいと思ったから、以下の通りに ranger を使うことのメモにした。

rangerとは

TUI ファイラーと言えば Midnight Commander のような2画面構成のものを連想しやすいと思うが、 ranger はシンプルで独特な1画面・3列表示という画面構成だ。これは慣れると非常に扱いやすいのだが、新バージョンでは2画面ファイラーのような使い方も可能になった。

ほかにも、タブをいくつも切り替えながら使えたり、画像、動画、pdf、書庫などのプレビュアーとしても使え、ファイルタイプに応じてアプリを起動する独自のファイルランチャーをも備えている。また、設定次第では git のステータスを端的に表示するようなことまでできてしまう。

X window の端末エミュレータで動くわけだから GUI ファイラーなんていらなくなってしまうかもしれない。言い過ぎだろうか。

rangerのインストール

パッケージマネージャでのインストール

パッケージマネージャでインストールできれば依存関係も解決してくれるから、当たり前のように手間がかからなくっていい(もっとも、基本的な依存は Python と less だけのようだけれど)。

Arch Linux のバイナリリポジトリには community/ranger があり、最新バージョンの登録も早いから、これを利用する([2018-03-22 Thu] 現在 1.9.1 ステーブル)。

$ sudo pacman -S ranger

また、 Ubuntu 16.04 LTS で試してみたところ、APTリポジトリに ranger はあるけれど、ちょっと古いバージョンの 1.7 が登録されてあった。もちろんそれでも便利に使えるのだけれど、Ver.1.8 より古いと最初に触れた2画面(多画面)ファイラーとしての機能とかが使えない。

ここはひとつ、次の要領で最新安定版をインストールして使うのがいいかと思われる。

pip またはマニュアルインストール

ranger は Python で実装されているからそれがないと始まらない。公式では Python 2.7 と Python 3.1〜3.4 上で動作確認がとられているもよう(私のところでは 3.5 と 3.6 でも大丈夫)。 Ubuntu 16.04 ではまだデフォルトが Python 2.7 のようだけれど、 ranger を使うにおいてはそれでも問題ない。

また、必須のページャーコマンドは Ubuntu を含め多くのディストロで less があたり前の様にインストールされていると思う。

そして ranger 本体だが、 http://ranger.nongnu.org/download.htmlranger-stable.tar.gz というのが最新ステーブルだ。

以下で2つの要領を示す。

  • pip でインストール

    昨今の Python 事情ではモジュール管理に pip を使うのがベターのよう。アンインストールするのも pip uninstall ですむのだし。

    まずはその pip が入っていなければそこから。Ubuntuでは以下のように。

    $ type pip || sudo apt install python-pip
    

    そして ranger 本体のインストール。下記のようにして公式ステーブルをダウンロード・インストールできる。現在([2018-03-22 Thu])はバージョン 1.8.1 ステーブル である。

    $ sudo pip install http://nongnu.org/ranger/ranger-stable.tar.gz
    

    なお PyPI にも ranger-fm での登録があり、こちらはバージョン 1.9.0 ステーブルである。

    $ sudo pip install ranger-fm
    

    ちなみに PyPI の登録に ranger という名前があるが、それはファイルマネージャの ranger とは違う別のものなのであった。ちょっと紛らわしいことになっているもよう。

  • pip を使わない

    pip を使わずとも、 README のやり方に沿って以下のようにできる。

    $ mkdir -p ~/Install && cd $_
    $ wget -O - http://nongnu.org/ranger/ranger-stable.tar.gz | tar xzf -
    $ cd ./ranger-?.?.?
    $ sudo make install
    

    もっとも、こうしてインストールした後で ranger をアンインストールしたいならば、解凍ディレクトリに作成された install_log.txt をもとにファイルを削除しなければならない。

rangerをちょっと操作してみる

インストールできたんなら、さっそくいじってみればいい。

端末エミュレータで ranger コマンドを実行する。

$ ranger

ranger の画面はシンプルな3列構成で、言われる通りミニマリスティックな雰囲気。真ん中の列にカレントディレクトリが表示されて、その左は上位ディレクトリ、右はカレントのカーソルが指すディレクトリの内容、あるいはファイルのプレビューや情報が表示される。

ranger_filer_ss01.png

キー操作は vim ライクなものだ。

h j k l で ← ↓ ↑ → 、 gg で最初にジャンプ、 G で最後にジャンプ。

テキストファイルにカーソルを合わせると右カラムに内容がプレビューされる。 i を押せば画面全体でプレビュー。もう一度 i でもどる。

ファイルとディレクトリのコピペは、 yy でコピー、あるいは dd で切り取って、 pp でペースト。 SPACE キーで複数を選択してからコピペしたりもできる。

検索するには / に続けて検索文字列を入力し ENTER でファイル名検索。その後で n を押せばその次の候補を検索するし、 N では逆方向に検索する。

タブ機能は、 gn で新規タブを作成すると右上にタブが番号で示される。 TAB キーを押すとタブを切り替えられる。

タブを2つ設けた状態で ~ を押すとタブ各々のカレントディレクトリが左右に並んで表示される。こうすると一方のタブ窓で yy してから TAB で他方の窓へ切り替えて pp でペースト、といった具合に2画面ファイラーのような使い方ができる。

ここでさらに gn を押してタブを増やせば3画面になるし、4画面も5画面もいける。ハイビジョン比率がありがたいマルチ画面機能なのであった。

もう一度 ~ を押せばもとの1画面3列のタイプにもどる。

q でタブを閉じる。最後のタブを閉じると ranger も終了する。また、タブをひとつずつ消さずとも Q を押せば一気にタブを閉じて ranger を終了できる。

ヘルプは ?m だ(man page を表示)。 ?k を押せば操作キー一覧が見られる。

rangerの使い方

rangerの操作モードは、起動後の標準画面(ブラウザ)、ページャ及びヘルプ表示、コマンドのコンソール、タスクビューの4つだ。

ブラウザ

  • ブラウザの基本操作

    rangerを起動すると現れる標準画面(ブラウザ)の主なキー操作は以下の通り。(※ C- コントロールキーを押しながら、 S- シフトキー、 M- オルトキー)

    操作キー 機能 他のキー
    j カーソル1行下 <down>
    k カーソル1行上 <up>
    h 上層へ移動 <left>
    l 開く <right> / <enter>
    E エディタ( $EDITOR )で開く  
    i ページャで開く/プレビュー画像を大きく表示  
    r アプリを指定して開く  
    H 戻る  
    L 進む  
    C-f 1ページ下へスクロール  
    C-b 1ページ上へスクロール  
    gg カーソルを最初の行へ移動  
    G カーソルを最後の行へ移動  
    C-l 画面を再描画  
    ~ マルチペイン/シングルペイン切り替え  
    gn タブ新規作成 C-n
    gt タブ切り替え <tab> / M-<right>
    gT タブ切り替え(逆方向) S-<tab> / M-<left>
    M-<番号> タブ番号指定切り替え(無ければその番号で作る)  
    C-w タブを閉じる gc
    q タブを閉じる(最後のタブを閉じたらranger終了) ZZ
    uq 直前に閉じたタブを復活  
    Q rangerを終了(強制終了) ZQ
    C-[ キャンセル <esc>

    ranger は多機能なので、いきなり全てのキーボードコマンドを憶えるなんてできない。でも使ってみるとわかるが、 g やら z やらを押すとその次に押すべき文字の一覧が画面下方にポップアップするので、慣れないうちはいくらかの救けにはなるだろう。難しいことなんかないかもしれない。

    ranger_filer_ss02.png

    テキストファイル上で l (あるいは <enter> または E )を押すと環境変数 $EDITOR に定義されたエディタコマンドでオープンしてくれる。 $EDITOR はコンソールエディタを指定するための環境変数だ。定義するなら vimnano が多いだろう(もちろん、 emacs -nw だっていい)が、定義がなければ ranger のデフォルトでは vim を使うようだ(1.7.0以降)。

    ~ キーを押すとシングルペインビューとマルチペインビューを切り替える。マルチペインというのは Ver.1.8 からの機能で、タブの内容を1画面に並べて表示するモード。タブが2つであれば MC のような2画面ファイラーのようになる。さらにタブを増やせば3画面、4画面ファイラー(?)というような使い方もできる。

    q を押すとタブを閉じ、最後のタブを閉じると ranger が終了する。沢山のタブを開いて作業することもあるだろうが、うっかり q を押して eww! となったときにはすかさず uq を押せば閉じたタブを復活させることができる。なお u ではじまるキーコンボはキャンセルやアンドゥで使われる。

  • 表示 / フィルタ

    表示に関する主な機能は以下の通り。

    キー 機能 他のキー
    R 表示内容をリロード  
    zh 隠しファイルを表示する/しない C-h
    zf フィルタをかけて表示  
    Mf Filename: ファイル名 ファイルサイズ  
    Mi fileInfo: ファイル名 文字コードやフォーマットなど ファイル種別  
    Mm Mtime: ファイル名 タイムスタンプ(mtime)  
    Ms Sizemtime: ファイル名 サイズ タイムスタンプ(mtime)  
    Mp Permissions: パーミッション ユーザ グループ ファイル名  
    Mt metaTitle: yeartitle authors ( ./.metadata.json 定義)  

    デフォルトでの開始時はドットはじまりのファイルが表示されないが zh で表示をトグルできる。

    フィルタ表示するには、 zf を押すと最下行に :filter と表示され入力が促されるので、フィルタしたい文字列を入力して <enter> 。フィルタ状態にあるディレクトリでは最下行のステータス欄右寄りに f-'hogehoge' などと表示される。フィルタを解除するにはもう一度 zf <enter>

    M のコンボは、真ん中の列(つまりカレント)の表示モードを切り替える。デフォルトの表示は Mf にあたるようだ。また Mt:meta コマンドで定義したメタデータを表示する。音楽ファイルや本のファイルを、ファイル名を変更せずに整理できて便利だ。

  • ソート

    ソートは o のコンボ。

    操作キー (正/逆) 並べる順番
    ob / oB basename (ファイル名順)
    oe / oE extension (拡張子名順)
    ot / oT type (type順)
    oa / oA atime (atime順)
    oc / oC ctime (ctime順)
    om / oM mtime (mtime順)
    os / oS size (サイズ順)
    on / oN natural (ディレクトリエントリ順)
    oz random (ランダム?)
    or reverse (逆順にする)

    ソート逆順は2文字目を大文字にするのだけれど、後から or を押したって同じ結果になる。それはつまり、 oBobor で代用できるので、小指がつっぱらかってしまって Shift を押したくないなぁというときなんかにいい。

    ソートした時にディレクトリを優先するか否か、あるいは大文字を優先するか否かの切り替えは以下のキーで行える。

    操作キー 並べる順番
    zd ディレクトリを先に並べて表示する/しない
    zs 大文字を先に並べて表示する/しない
  • ジャンプ

    軽快とはいえ、カーソルキーだけでディレクトリをたどるのは大変だ。

    :cd というコマンドモード(後述)が使えるが、 cd と打つだけでそのままコマンドモード :cd のプロンプトになるようになっている。

    つまり、 cd/etc<enter> と打てば /etc へ移動するし、 cd~<enter> とやればホームディレクトリへ、その位置で cd.config<enter> などと相対指定もできる。

    操作キー 機能 他のキー
    cd<dir> cd <dir> :cd <dir>
    gh ホームディレクトリへジャンプ  
    g/ / gr
    gd /dev  
    ge /etc  
    gm /media  
    gM /mnt  
    go /opt  
    gs /srv  
    gu /usr  
    gv /var  
    '' 直前のディレクトリへジャンプ ``
    gl カレントディレクトリのリンクを辿る  
    gL カーソル対象ファイルのリンクを辿る  
    f インクリメンタルサーチ  

    また、主要なディレクトリへの移動には専用のキーが g のコンボに設けられており、キーストローク数が少なくてすむ。

    直前のディレクトリへのジャンプは '' (シングルクォートキーを2回)。

    glgL はシンボリックリンクのターゲットへジャンプする。地味に便利なこの機能はそれぞれ、 glcd $(readlink -f .)gLcd $(dirname $(readlink -f <file>)) と同じことのように考えられる。

    インクリメンタルサーチは f に続けて検索したい文字列を入力していくと、カレントのディレクトリ上に候補を見つけた時点でそこへジャンプする。

  • ファイル名検索

    カレントディレクトリ内でファイル名の検索ができる。 / を押すと、最下行のコンソールに :search と入力された状態でコマンドモードになるので、続けて文字列を入力し <enter> で順方向に検索。 nN で再検索する。

    操作キー 機能
    / ファイル検索(文字列入力)
    n 順方向に検索
    N 逆方向に検索
  • ブックマーク

    ブックマークを扱うことができ、よく使うディレクトリを設定しておいて素早くジャンプできる。

    操作キー 機能
    m<key> <key> にブックマークする (<key>: 任意の1文字)
    '<key> <key> のブックマークにジャンプ
    um<key> <key> のブクマを削除する

    扱い方は less と似た要領で、マークしたいディレクトリを表示してから m と任意の1文字を押せばブックマーク登録できる。呼び出したい時は ' の後に登録に使った1文字を入力する。

    ブックマークは ~/.config/ranger/bookmarks に保存されるから、rangerを終了しても憶えていてくれる。

    なお '` (バッククォート)は同じと man page に書かれてあるから、押しやすい方を使ったらいい。

  • コピペと選択

    キル&ヤンクまたはヤンク&ペーストなどとも言うが、膾炙した表現ではコピー&ペースト、すなわち「コピペ」だ。対象を切り取る(カット)かあるいは複写(コピー)を取り込んでバッファ(これもキルリングとかレジスタとも言うが)に保持しておき、必要な時に取り出して再利用することである。

    ともかく、 ranger のそれも一般的な概念の範疇を出ずに多機能を実現しており、 vim のオペレーションになぞらえてあるから判りやすい。

    まずはコピペコマンドのプリフィクスだが、 d のコンボがカット、 y がコピー、 p がペーストで、 u はキャンセルとなる。

    基本的には dd / yy で カット / コピー してバッファへ取り込んでおき、目的のディレクトリへ移動してから pp でペーストする。 vim のように <数値> との組み合わせが可能で、例えば 2dd2yy )とするとカーソル位置から下へ2行分を ddyy )することになる。また ggG と組み合わせて、 dggygg )でカーソルから最初の行まで、 dGyG )で同じく最後の行までをカット(コピー)できる。

    操作キー カット/コピー機能 他のキー
    dd 対象をカット状態にする  
    dr 対象のカット状態をリセット  
    yy 対象をコピー状態にする  
    yr 対象のコピー状態をリセット  
    ud カット/コピー状態を全てキャンセル uy
    操作キー ペースト機能
    pp ペースト (同名ファイルがあれば別名でペースト)
    po ペースト (同名ファイルに上書き)
    pl シンボリックリンクを作成
    pL シンボリックリンクを作成 (相対リンク)
    phl ハードリンクファイルとしてペースト
    pht ディレクトリ構造ごとハードリンクファイルをペースト

    ranger のコピペアクションが起こるのはペーストを行ったとき。 dd を押した時点では何も起きないけれど pp でペーストを指示した時にはじめて、もとのファイルのカットとカレントへの貼り付けが一連のアクションとして実行される、ということである。表の中で「対象の切り取り状態」などと表現してあるのはそのためだ。別の言い様なら、 ddyy もバッファへ取り込むのは同じだがカットフラグかコピーフラグの違いがある、とでも表現できるだろうか。

    いったん dd (あるいは yy )を押してからやっぱりやめよう、となった場合は「カット状態(コピー状態)」をリセットしなければならない。その場合は再び対象のファイルの上で今度は dryr )を押す。あるいは、後述するマルチプル機能で利用する ud を押せば対象を気にせずカット/コピー状態をキャンセルできる。

    ペーストについては、同名ファイルが存在するところへ pp でペーストした場合、上書きを回避するようファイル名末尾に __1 などと付け加えたものをペーストしてくれる。しかし上書きしちゃったほうがいい場合もあるだろう。そんなときは po で上書きペーストしてやる。

    それと、普通のペーストだけでなく、シンボリックリンクファイルをペーストしてくれる機能がある。 pl で絶対パスのリンクを、 pL では相対パスのリンクを作成してくれる。

    phl でハードリンクファイルをペーストすることもできる。ちょっと変わった便利機能として、ファイルを含むディレクトリをコピーしてから他のディレクトリへ行き pht を押すと、もとのディレクトリツリーを再現した中へハードリンクファイルを作成してくれる。

    リンク作成でちょっと注意したい点がある。 dd した後に pl するともとのファイルはそのままにシンボリックリンクが作られるが、切り取り状態はキャンセルされていないので、それを忘れてうっかり pp するとたいへんだ。ハードリンクの phl でも同様である。ここらへん、ちょっとわかりにくいところでもある。あやまってファイルをポトッと落とすまえに ud でカット状態をキャンセルしておく。あるいは、リンク作成時にはあらかじめ dd でなく yy を使うようにしておくと、少なくとも紛失という自体は避けられるかも知れない。

    また、複数のファイルやディレクトリを選んでおいてから、カット / コピー することもできる。ファイルを選択するには <space> を使い、 v で選択状態が反転する(何も選択されていない場合は全てを選択することとなる)。 V (大文字)を押すと選択モードになり、カーソル移動で選択範囲を広げる。再び V (または j k 以外のキー)で範囲を確定する。さながら vim のビジュアルモードのようだ。選択したファイルは黄色い太字になって視覚に訴える。

    操作キー 選択機能
    <space> ファイル選択
    v すべて選択 または 選択対象を反転
    V 範囲選択モード
    uv 選択解除

    <space> による選択はコピペだけでなく、他の機能とも複合的に使われる。

    なお、この方法では1つのディレクトリ内での複数ファイルのコピペ操作は可能だが、別々のディレクトリに存在するものを複数選択してコピペすることはできない。それには以下のマルチプルなコピペ機能を使う。

  • コピペ(マルチプル)

    dd / yy はその都度バッファの確保と取り込みを行うため、常にカレントディレクトリにのみ有効ということになる。つまり、他のディレクトリへ一時にペーストできるのはもとの1ディレクトリ内の分だけということだ。

    しかし da / ya を使うと複数のディレクトリの内容を同時に選んでおいて目的のディレクトリにまとめて移動や複写といったトリッキーな使い方が可能になる。

    操作キー カット/コピー機能 他のキー
    da カット状態にしてバッファへ追加  
    dt カットモードに切り替え  
    ya コピー状態にしてバッファへ追加  
    yt コピーモードに切り替え  
    ud カット/コピー状態を全てキャンセル uy

    da / ya はカット/コピー時にバッファを再確保せずに追加する機能だ。これは <space> で選択したものについても同様である。キャンセルは ud で行う。

    「カットフラグかコピーフラグの違い」などという表現で前述したが、バッファに取り込まれたひとつひとつのファイルにそのようなフラグを立てているのではなく、ペーストの直前にどっちのモードが有効であるかによってカットかコピーかが決定されるようだ。

    例えば、複数のファイルを ya でコピー状態にしていきながら、途中で da を押すとカット状態のモードに切り替わり、直後の pp では、それまでバッファに追加してきたものはすべてカットされるということになる。なお、 dt / yt にはモードをそれぞれ カットモード/コピーモード へ変更する機能があてられている。

    最初はとっつきにくい機能だが上手く使うと、複数のディレクトリからランダムにファイルを集めたいときなどは実にスピーディに行えるので重宝する。 CLI だけではなかなかこうはいかないだろう。

    ただし、うっかりやっちゃう度も高い機能ではあるので、慎重に操作したほうがいいだろう。マルチプル操作前には必ず ud キーを押してから開始する、といったことがミスの予防につながると思う。

  • ファイル名のコピペ

    xsel コマンドが使える環境では以下のコマンドが有効になり、ファイル名のコピペができるようになる。

    操作キー 機能
    yp フルパス名をコピーする
    yn ファイル名をコピーする
    yd ディレクトリ名をコピーする

    あらかじめ名前をコピーしたいファイルの上で yp などとやって、コンソールで Shift+Insert などでペーストしたりする。

  • リネーム / ディレクトリ作成 / 削除

    検索やフィルタなどもそうだったが、これらのコマンドは最下行に表示されるコンソールでコマンドを実行する。コマンド入力までをキーコマンドにしてあり、コンソール入力に続けて <enter> で実行される(コマンドとコンソールについてはその項を参照のこと)。

    操作キー コマンド (_ : カーソル) 機能 他のキー
    a :rename <name>_.<ext> リネーム / 拡張子の前にカーソル  
    A :rename <name>.<ext>_ リネーム / ファイル名末尾にカーソル  
    I :rename _<name>.<ext> リネーム / ファイル名先頭にカーソル  
    cw :rename リネーム / ファイル名なし  
    <f7> :mkdir ディレクトリ作成  
    dD :delete 削除 <del> / <f8>

    リネームコマンドの aAIcw は、 vim の編集機能に意味合いを似せている。

    削除は、対象が複数の場合は確認してくる。

  • ファイルアクセス権の編集(chmod)

    chmod は数値指定とシンボル指定の両タイプが扱える。

    数値指定は数値の後に = でいい。つまり、コマンドラインで chmod 755 <file> とやっている事は、 変更したいファイルにカーソルをあわせて 755= と入力するだけででいい。非常に楽だ。スペースキーで複数選択してやってもいい。

    操作キー 機能
    <num>= chmod 数値指定

    シンボル指定は、付与が + で削除が - 、何れかを最初に押して続くコンボで権限の内容を指定する。 chmod コマンドの引数で使うシンボルと同じなので直感的かと思う。

    このキーコマンドの数は48あり、そのまま表にすると分かりにくいので下記のように表してみた。

    キーA   他のキー
    + u (所有者) に権限付与 +u
    +g g (グループ) に権限付与  
    +o o (他のユーザ) に権限付与  
    +a a (全て) に権限付与  
    - u (所有者) から権限削除 -u
    -g g (グループ) から権限削除  
    -o o (他のユーザ) から権限削除  
    -a a (全て) から権限削除  
    キーB  
    r 読み込み権限
    w 書き込み権限
    x 実行権限
    X 何れか実行権限ありなら追加/削除
    s セットID
    t スティッキービット

    上の表のキーAに続けて下の表のキーBを組み合わせて実行する。例えば、所有者に実行権限を付与するにはコマンドラインで chmod u+x <file> とやるけれど、 ranger では +ux (あるいは +x )とする。 chmod g+x なら +gxchmod o-x なら -ox という具合。

    もっとも、こんな表を憶えなくとも +- を押したところで画面下にガイドがポップアップするから、それをみながら操作すればいい。

  • ディレクトリ使用量の表示
    操作キー 機能
    dc ディレクトリ内の総サイズを算出
    du du コマンド

    dc は対象ディレクトリの総量を算出して表示する。これは <space> で複数のディレクトリを選択して行っても機能する。

    また、ディレクトリ内の使用量を調べたい時に使う du コマンドだが、ranger ではその名の通りに du と入力すればカレントディレクトリ内の各ディレクトリの使用量をページャで表示してくれる。

  • タグ

    ファイルにタグ付けできる。

    タグは全て1文字で、ファイル名の左に表示される。目印にしてもいいし、マクロで %t として使ったりもする。

    操作キー 機能
    t タグ * をつける/はずす
    "<tag> タグ <tag> をつける/はずす (<tag>: 任意の1文字)
    ut タグをはずす

    t でデフォルトのタグ( * )をつける。任意のタグをつけるには " につづけて任意の1文字を入力する。例えば "m とすれば m というタグがファイル名の左に表示される。

    何れも、同じタグのついたファイルではタグをはずし、そうでなければタグ付けする。

    だから、複数選択してからタグ付けキーを押すと、同名タグは反転することになる。

    同じディレクトリ内のタグ設定されたいくつかのファイルを全て解除したいときは、 vut とすればいい。

    なお、タグ情報は ~/.config/ranger/tagged に保存されており、 ranger を終了しても憶えていてくれる。

  • サブシェルとコマンド
    操作キー 機能
    S 現在のディレクトリでサブシェルを起動
    : コマンド

    S を押すと表示中のディレクトリでサブシェルを起動してくれる。コマンドラインで処理したい時に使う。 exit コマンドで戻る。

    サブシェルでは ranger をさらに起動でき、またさらにサブシェルを起動してまた ranger を、というようにネストして実行可能だ。 ranger はディレクトリ移動が便利なものだからいくつもネストしてしまって、気付いたら終了させるまで延々と exit … なんてことになる。これを避けるための工夫があるので、後述する。

    また、コロン : (セミコロン ; でもいい)で vim のようにコマンドが使える。例えば :q <enter> でタブを閉じるなど。「コマンドとコンソール」の項を参照のこと。

  • タスクビューとログ表示
    操作キー 機能
    w タスクビュー
    W ログ表示

    タスクビューではrangerのバックグラウンドタスクが一覧され、タスクの停止などが行える。タスクビューの項を参照のこと。

    ログ画面では、画面最下行に現れたメッセージを一覧でみられる。

  • ヘルプ

    ? (あるいは <f1> )を押すと最下行にヘルプメニューが表示される。

    操作キー 機能 他のキー
    ?m マニュアル (man page) を表示 <f1>m
    ?k キーバインディング一覧を表示 <f1>k
    ?c コマンド一覧を表示 <f1>c
    ?s セッティング内容を表示 <f1>s
    gR RANGERDIR (rangerがあるところ)へジャンプする  
    g? ドキュメントディレクトリ( /usr/share/doc/ranger )へジャンプする  

    ヘルプ画面の操作はページャの項を参照のこと。

    g? でrangerのドキュメントを収めたディレクトリへジャンプしてくれる。ここにはちょっとこった使い方のヒントがあったり、お宝箱のようだ。

コマンドとコンソール

ブラウザで : を押すと vim のようにコマンドモードになり、最下行のコマンドコンソールに入力が促される。

コンソール入力中のキーバインドは以下の通り、 readline ライクなもの。

操作キー 機能 他のキー
C-f カーソルを右へ <right>
C-b カーソルを左へ <left>
C-n 履歴を辿る <down>
C-p 履歴を遡る <up>
C-a カーソルを行頭へ  
C-e カーソルを行末へ  
C-d Delete(カーソル位置の文字を削除) <delete>
C-h Backspace(カーソル直前の文字を削除) <backspace>
C-m 実行 <enter>
C-c コンソールを閉じる  

例えば :q <enter> でタブ終了、 :help <enter> でヘルプといった具合。

キーバインドされていない機能もコマンドモードで呼び出せる。

コマンド一覧は ?c で見ることができる。

なお、セミコロン ; でも コロン : 同様になる。 US-ASCII キーボードなんかで Shift が面倒だからリマップ、という必要はない。

  • :shell

    :shell に続けてシェルコマンドを書いて実行することができる。 S でシェルに抜けてやってもいいが、コンソール実行の方が手っ取り早いことが多い。

    :shell は多用するので、あらかじめ :shell (とオプション)を入力しておいてくれるキーが登録されている。

    操作キー コマンド 機能
    ! :shell  
    @ :shell %s 選択したものを対象にする
    # :shell -p 出力をページャで表示

ページャ

ブラウザ画面にて、テキストファイル上で i を押すと簡易ページャ表示となる。

ranger_filer_ss_pager01.png

ranger_filer_ss_pager02.png

このページャ表示での主な操作は以下の通り。

操作キー 機能 他のキー
j 1行下へスクロール <Down>
k 1行上へスクロール <Up>
C-f 下へページスクロール  
C-b 上へページスクロール  
C-l 画面を再描画  
g 最初へ  
G 最後へ  
E 編集  
q ページャを閉じる <Esc>

ヘルプ画面では上記ページャ同様のキー操作に加えて / で検索ができる。

後述するが必要なアプリが起動できれば、画像や書庫なども i でプレビュー表示されるようになる。

タスクビュー

ブラウザで w を押すとタスクビュー画面になる。

ranger で行うバックグラウンドタスクがこの画面に一覧表示される。

操作キー 機能 他のキー
j カーソルを1行下 <Down>
k カーソルを1行上 <Up>
C-f 下へページスクロール f / <space>
C-b 上へページスクロール b
C-l 画面を再描画  
J タスクを1行下げる <Pagedown>
K タスクを1行上げる <Pageup>
dd タスクを中止する <delete>
g 最初へ <home>
G 最後へ <end>
q タスクビューを終了 w / <Esc>

JK でタスクの順番を変えられる。また dd でそのタスクを終了させる。

大きいサイズのファイルコピーをとりやめたいなどは、ここで行う。

rangerのカスタマイズ

カスタマイズの準備

カスタマイズは ~/.config/ranger 下に置いた設定ファイルに書いて行う。ゼロから書くのは大変なので、起動オプションの --copy-config=all でデフォルト設定されたファイルを作成し、これを書き換えるようにする。

$ ranger --copy-config=all
creating: /home/jeneolla/.config/ranger/rifle.conf
creating: /home/jeneolla/.config/ranger/commands.py
creating: /home/jeneolla/.config/ranger/commands_full.py
creating: /home/jeneolla/.config/ranger/rc.conf
creating: /home/jeneolla/.config/ranger/scope.sh

rangerの設定は rc.conf に書く。また、ファイルランチャーとしての機能は rifle.conf に設定する。

scope.sh は ranger のプレビュー機能を実現するシェルスクリプトで、これがあれば後は必要なアプリをインストールするだけでプレビュー出来るようになる(後述)。

なお、ファイルが既に存在する場合は上書きをしない。試しにやってみた(以下は rc.conf のみ指定してみたもの)。

$ ranger --copy-config=rc
already exists: /home/jeneolla/.config/ranger/rc.conf

プレビュー

テキストファイルについてはそのままでもプレビューされるようになっているでしょう。これに加えて、必要な外部コマンドを揃えれば書庫ファイルやPDFファイル、メディアファイルの情報が右のカラムに表示されるようになる。また、テキストのソースコードを色付きで見やすくプレビューすることも可能となる。

  • ファイル情報のプレビュー

    以下が各種ファイルの情報プレビューに利用できる外部コマンド。

    コマンド 機能
    highlight ソースコードを色分け表示
    lynx / elinks htmlプレビュー
    atool 圧縮書庫管理
    pdftotext PDFプレビュー
    mediainfo 動画やオーディオファイルの情報

    atool は圧縮書庫の管理ツールで、圧縮形式それぞれのネイティブツールを必要とする。ドキュメントでは以下のアーカイブツールのインストールを求めている。

    bzip2 / cpio / gzip / lha / lzma / lzop / p7zip / tar / ace / rar / zip

    なので、これらもインストールしてしまう。

    Arch Linux では以下をインストール。

    $ sudo pacman -S highlight lynx elinks poppler mediainfo
    $ sudo pacman -S atool bzip2 cpio gzip lhasa xz lzop p7zip tar unace unrar zip unzip
    

    Ubuntuでのインストールは以下。16.04で試した。

    $ sudo apt install highlight lynx elinks poppler-utils mediainfo
    $ sudo apt install atool bzip2 cpio gzip lhasa lzma lzop p7zip tar unace unrar zip unzip
    

    これでソースコードは色付きで、書庫やPDFなどは中身のリストや情報がプレビューされるようになる。

    ranger_filer_ss_preview_code.png

    ranger_filer_ss_pager_code.png

    ほかに、transmission-cli があれば torrent ファイルをプレビューできるようになるようだ。

  • 画像のプレビュー

    画像をプレビューするには w3m が必要となる。

    まずはインストール。

    $ sudo pacman -S w3m
    
    $ sudo apt install w3m-img
    

    次に ~/.config/ranger/rc.conf をエディタで開いて set preview_imagesfalse になっているところを true にする。

    # Use one of the supported image preview protocols
    set preview_images true
    

    また、枠線を表示しない設定だとプレビュー画像の一部が縞になってうまく表示されないので、枠線を表示するように設定する。 set draw_bordersfalsetrue にする。

    # Draw borders around columns?
    set draw_borders true
    

    これで画像ファイルのプレビュー表示が可能になったはず。

    ranger_filer_ss_preview_image.png

    なお、わたしのところでは枠線表示で不具合を回避できているけれど、現状ではまだいまひとつ不具合が発生するケースがあるようで、端末エミュレータを透過表示に設定しているとうまく表示されないとか、あるいは tmux では表示が乱れやすい、 GNU Screen なら大丈夫だったよ、などといったことが言われているもよう。

  • 動画のプレビュー

    mediainfo によって動画の情報を表示するようにしたけれど、 ffmpegthumbnailer をインストールして scope.sh に手を加えるとプレビューに動画のサムネールを表示できるようになる。

    まずは ffmpegthumbnailer (長い名前)をインストールする。

    ## Ubuntu
    $ sudo pacman -S ffmpegthumbnailer
    
    ## Arch Linux
    $ sudo apt install ffmpegthumbnailer
    

    次に、 ~/.config/ranger/scope.sh を開くと、

    # Image preview for videos, disabled by default:
    # video/*)
    #     ffmpegthumbnailer -i "$path" -o "$cached" -s 0 && exit 6 || exit 1;;
    

    となっているところがある。コメントの下の2行をアンコメントしてあげる。

    # Image preview for videos, disabled by default:
    video/*)
        ffmpegthumbnailer -i "$path" -o "$cached" -s 0 && exit 6 || exit 1;;
    

    これで動画のサムネールがプレビューされるようになる。

    動画ファイルにカーソルをのせると、ちょっと考えてから画像を表示してくれる。サムネールはキャッシュされるので、2回めからは即座に表示されるようになる。

    ※ ranger Ver.1.7.1 で確認。

カラーテーマを変更する

ranger にはあらかじめ4種類のカラーテーマが用意されてあって、設定ファイルに記述して取り替える。すなわち、 ~/.config/ranger/rc.confcolorscheme の値を defaultjunglesnowsolarized の何れかに書き換える。

以下それらのスクリーンショッツ(但私は端末エミュレータの配色を gruvbox にしてるんでちょっと色褪せた感じになっているとはおもうけれど)。

  • default
    # Which colorscheme to use?  These colorschemes are available by default:
    # default, jungle, snow, solarized
    set colorscheme default
    

    ranger_filer_ss_colorscheme1_default.png

  • jungle
    set colorscheme jungle
    

    ranger_filer_ss_colorscheme2_jungle.png

  • snow
    set colorscheme snow
    

    ranger_filer_ss_colorscheme3_snow.png

  • solarized
    set colorscheme solarized
    

    ranger_filer_ss_colorscheme4_solarized.png

ranger で fasd を使う

ranger のカレントディレクトリ変更はカーソル移動、履歴/ブックマークジャンプ( H / L / '' / '<key> )、あるいは :cd コマンドで行う。それらは cd コマンドの代替かつ延長的機能として必要十分と考えられるけれど、 fasd のようなジャンプツールをお使いの向きには ranger でのこの事がちょっと物足りないかもしれない。

fasd は frecency スコアの履歴からファイルやディレクトリの候補を選ぶタイプのオートジャンプツール。 frecency っていうのは frequency と recency にちなんだ造語で、その名の通り訪問回数や新しさなどによってスコアをつけながら履歴をとるアルゴリズムのことらしい。

まあそういう細かいことはともかく、fasd でのディレクトリジャンプは非常に有用なもんで、素早い、簡単、直感的という3つが揃ったありがたい実装なのだ。そうなもんだから依存度も高いことで、だったらこれを ranger でも使えたらさぞかし便利だろうかと、私も思う。

ranger には Python スクリプトでコマンドを追加する機能があって、ユーザによる拡張がワリと容易に実現できる。

コマンドは ~/.config/ranger/commands.py に記述して追加する。うえでさっき --copy-config で作成した commands.py を覗いてみると、例としてコマンドひとつ分の class がテンプレートのごとく書かれてあって記述要領もそこに注釈されている。同様にその後ろへ class を追記していけばいい。

さて、 GitHub の ranger Wiki には 追加のコマンド集(パイソンスクリプツ) が載っかっていて、その中に fasd の利用を実現するものも収載されてある。その中から以下へ fasd の分を抜粋させてもらった。

# fasd command with ranger
#   ranger Wiki : https://github.com/ranger/ranger/wiki/Commands
#   fasd : https://github.com/clvv/fasd
class fasd(Command):
    """
    :fasd

    Jump to directory using fasd
    """
    def execute(self):
        import subprocess
        arg = self.rest(1)
        if arg:
            directory = subprocess.check_output(["fasd", "-d"]+arg.split(), universal_newlines=True).strip()
            self.fm.cd(directory)

これを commands.py に追記して、ranger を起動して、

:fasd doc

などと入力して Enter 。いつもコマンドラインで使っている fasd のディレクトリジャンプが ranger コンソールでできる。

しかしコロンとスペース合わせて6文字も入力するのはまどろっこしいので、キーバインドに手を加えてもっと楽にしたい。私は、どうも e が空いてるようなのであててみた。 ~/.config/ranger/rc.conf に以下を追記。

map e  console fasd%space

これで e を打つとコンソールが :fasd コマンドでプロンプトになる(これは大変便利だと思う!)。

ranger のちょっとした不都合を解消する

rangerの多重起動を避ける

ranger はディレクトリの移動が便利なのでつい、サブシェルを起動した状態でさらに ranger を実行し、またさらにサブシェルでまたまた、という風にやってしまう事が多い。そうやってネストしていった後では何度も exit して戻る羽目に陥る。それはそれで大変なので、そうならないような工夫をする。

ranger() { [ -n "$RANGER_LEVEL" ] && exit || command ranger "$@"; }

このファンクションは ranger を起動すると定義される $RANGER_LEVEL をみて、ネストしそうになったら exit するに止めてネストを避けるもの(参考: ArchWiki )。

これで ranger はネストしなくなるものの、他のコマンドについてはその限りでないから、以下のようにしてプロンプトに ranger 下のサブシェルである旨を表示し、注意を促すようにする。

[ -n "$RANGER_LEVEL" ] && PS1="(RANGER) $PS1"

これは g? でジャンプした先 /usr/share/doc/rangerexamples ディレクトリに置いてある bash_subshell_notice.sh を参考にした。ここにはほかにも便利なものがあるので活用したい。

less の設定と不都合回避

ranger は一部機能を less に依存しているからその使用環境いかんによっては往々にしてうまくないことになる。ここでは less が参照する環境変数 LESS について触れる。

例えば ranger の du コマンドの結果表示が一瞬で終わってしまって見られず、役に立たないといったことが起こりうる。設定フレームワークの Prezto を利用中の zsh 上でこの不都合があった。それは zprofile 中に書かれた LESS 定義に -F オプションが含まれていたからなんである。

lessの -F オプションは表示結果が1ページに収まるときに less 自身を終了させる。表示結果が1ページを超えないならば ranger 上ではページャコマンド終了と同時にブラウザ画面に戻るから、表示が一瞬で終わってしまうことになる。

また -X オプションは画面クリアを行わないようにするが、これが定義されていると ranger では前の表示内容が残ってしまって、やはりよろしくない(稀に役立つこともあるけど仕様外のことと思う)。

これらのオプションをセットすることが不具合というのではないけれど、 ranger を使ううえでは困ってしまう。

さしあたって、不都合なオプションを一時的に無効にするのがよろしいかと思う。 less の各オプションを無効化するには + 記号を足せばいいから、 LESS="$LESS -+F -+X" ranger といったようなコマンドで ranger を起動すればいい。

シェルのrcファイルへまとめて記述

また、私は ranger と打つのはまどろっこしい気がして rng と短くしたいと思った。

以上の事をまとめて以下のようにした。

ranger() { [ -n "$RANGER_LEVEL" ] && exit || LESS="$LESS -+F -+X" command ranger "$@"; }
[ -n "$RANGER_LEVEL" ] && PS1="(RANGER) $PS1"
alias rng='ranger'

bashrczshrc などに追記しておく。

Sources and Revisions