コマンドラインで動かすファイルマネージャrangerの設定

LinuxもしくはMacで使うことの出来る、CLIファイルマネージャである[ranger](http://ranger.nongnu.org/)の紹介と、使いやすくする設定を紹介します。


**追記(2015/06/13 21:01)**

基本的な設定方法をまとめたので、こちらもご覧ください。

- [CLIファイルマネージャrangerの基本設定 - Qiita](http://qiita.com/ssh0/items/3d71da415953003d47d7)

**追記ここまで**

![ranger.rc.conf.png](https://qiita-image-store.s3.amazonaws.com/0/54869/c1a19aa9-5e0b-07b3-ccdd-896c844ae937.png)

![picture.png](https://qiita-image-store.s3.amazonaws.com/0/54869/3f983129-15a4-0599-5d6c-b2d27a52e006.png)


まず、rangerそのものについてですが、vimライクなキーアサインでも動かすことができ、設定ファイルも読みやすく、挙動も安定しているので、CLIで動くファイルマネージャを探しているのなら、迷わずこれでいいと思います。なにより軽いので、GUIでファイルマネージャを使うよりは軽快で、一度このスピードになれてしまうと、もう戻れない感覚だと思います。

詳細な説明については、rangerの[Wiki](https://github.com/hut/ranger/wiki)を見てもらうか、英語ですが以下の動画を見てもらえば分かるのではないかと思います。以下では、個人的に便利だと感じた使い方と、設定について述べていこうと思います。

- [Ranger - Console File Manager - Linux TUI - YouTube](https://www.youtube.com/watch?v=qooLR8NmYKs)  
[![ Ranger - Console File Manager - Linux TUI - YouTube [Ranger - Console File Manager - Linux TUI - YouTube]](http://img.youtube.com/vi/qooLR8NmYKs/2.jpg)](https://www.youtube.com/watch?v=qooLR8NmYKs)

- [ranger screenshots](http://ranger.nongnu.org/screenshots.html)

## インストール

for apt-package(Ubuntu, Debian, )

```bash
sudo apt-get install ranger w3m lynx highlight atool mediainfo xpdf caca-utils
ranger --copy-config=all
```

for Mac

```bash
brew install ranger w3m lynx highlight atool mediainfo xpdf libcaca imlib2
ranger --copy-config=all
```

ref:

- https://gist.github.com/KyleJamesWalker/11275311


## 基本のキーアサイン

以下に基本的なキーアサインを書いておきます。これだけ押さえていれば、大体普通の作業をするのには困らないと思います。とってもVim的なキーバインドなので、慣れている人であれば、すぐに使えるようになると思います。

<table>
<thead>
<tr class="header">
<th style="text-align: left;">key</th>
<th style="text-align: left;">operation</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;"><code>h,j,k,l</code> or 矢印キー</td>
<td style="text-align: left;">上下左右移動</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>l</code>or Enter</td>
<td style="text-align: left;">ファイルを開く/ディレクトリ内に入る</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>r</code></td>
<td style="text-align: left;">起動するアプリケーションを指定</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Space</td>
<td style="text-align: left;">ファイルを選択</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>v</code></td>
<td style="text-align: left;">すべて選択(選択反転)</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>V</code></td>
<td style="text-align: left;">選択モード(範囲選択)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>y&lt;char&gt;</code></td>
<td style="text-align: left;">yank &amp; 何か操作</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>yy</code></td>
<td style="text-align: left;">選択されているファイルをコピー</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>yp</code></td>
<td style="text-align: left;">選択されているファイルのフルパスをコピー(xselが必要)</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>d&lt;char&gt;</code></td>
<td style="text-align: left;">cut &amp; 何か操作</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>dd</code></td>
<td style="text-align: left;">選択されたファイルを切り取り</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>p&lt;char&gt;</code></td>
<td style="text-align: left;">貼り付け + オプション</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>pp</code></td>
<td style="text-align: left;">切り取り、コピーしたファイルを貼り付け</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Delete</td>
<td style="text-align: left;">削除(rm)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>g&lt;char&gt;</code></td>
<td style="text-align: left;"><code>&lt;char&gt;</code>で指定された動きをする</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>gn</code> or Ctrl+<code>n</code></td>
<td style="text-align: left;">新しいタブを開く</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>gc</code> or Ctrl+<code>w</code></td>
<td style="text-align: left;">タブを閉じる</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>gt</code> or Ctrl+Tab</td>
<td style="text-align: left;">次のタブへ移動</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>gT</code> or Ctrl+Shift+Tab</td>
<td style="text-align: left;">前のタブへ移動</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Alt+<code>&lt;n&gt;</code></td>
<td style="text-align: left;">番号<code>&lt;n&gt;</code>のタブへ移動(ない場合は作成)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>z&lt;char&gt;</code></td>
<td style="text-align: left;">オプションのトグル</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>zh</code></td>
<td style="text-align: left;">隠しファイルの表示/非表示のトグル</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>m&lt;char&gt;</code></td>
<td style="text-align: left;">現在のディレクトリを<code>&lt;char&gt;</code>キーでブックマーク</td>
</tr>
<tr class="odd">
<td style="text-align: left;">`<code>&lt;char&gt;</code></td>
<td style="text-align: left;">ブックマークされたディレクトリに飛ぶ</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>``</code></td>
<td style="text-align: left;">最近開いたディレクトリに飛ぶ</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>cw</code></td>
<td style="text-align: left;">ファイル名を編集</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>A</code></td>
<td style="text-align: left;">ファイル名を編集(現在のファイル名が入った状態)</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>/</code></td>
<td style="text-align: left;">インクリメンタルサーチ</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>S</code></td>
<td style="text-align: left;">現在のディレクトリでサブシェルに入る</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>:</code></td>
<td style="text-align: left;">コマンド入力モードに入る(Ctrl+<code>c</code>で抜ける)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>!</code></td>
<td style="text-align: left;">現在のディレクトリでシェルコマンドを実行する</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>q</code></td>
<td style="text-align: left;">rangerを終了</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>?</code></td>
<td style="text-align: left;">マニュアルを表示</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>1?</code></td>
<td style="text-align: left;">キーバインディングを表示</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>2?</code></td>
<td style="text-align: left;">コマンドのヘルプを表示</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>3?</code></td>
<td style="text-align: left;">現在の設定値を表示</td>
</tr>
</tbody>
</table>



## 設定ファイル

rangerの設定ファイルは、Linuxなら`~/.config/ranger`以下にあります。

![screen_003.png](https://qiita-image-store.s3.amazonaws.com/0/54869/6c9bb5ec-8230-7aeb-c895-1d51afad5796.png)


rc.confではオプションとキーバインディングを、rifle.confでは、各ファイルタイプについて、どのプログラムを用いて開くかを設定できます。元々の設定ファイルがよく書かれているので、ある程度英語が読めれば、簡単に設定が出来ると思います。

scope.shでは、

```bash
# ranger supports enhanced previews.  If the option "use_preview_script"
# is set to True and this file exists, this script will be called and its
# output is displayed in ranger.  ANSI color codes are supported.
```

とあるように、オプションでプレビュー表示をオンにしたとき(`set preview_files true`)に、ファイルタイプにあわせてどのようなプログラムを使ってプレビュー表示をさせるかを設定することができます。

また、colorscheme以下に自分で定義したカラースキームを置き、モジュールとして読み込むようにしてあげると、カラースキームを変更することができます。デフォルトでは"default","jungle","snow"が使えます。

自分の設定ファイル晒しときますね。

- [dotfiles/ranger at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/tree/master/ranger)


## rangerに関連して設定しておくといいもの

### サブシェルのネストを防止する

rangerを使っていると、cdコマンドを使って移動するより断然早くディレクトリ間を移動できるので、どんどん`S`でシェルで抜けてまたrangerを開いて・・・としていくことになるかと思います。さて、一段落したので端末を閉じましょう、というときに、`exit`とすると、rangerが立ち上がります。！？となるかもしれませんが、`S`はサブシェルを開いてその中で作業するものなので、気がついたらどんどんネストしていた、という事態に簡単に陥ります。これを解決する簡単な方法は、`~/.zshrc`などに、以下のように関数を登録しておくことです。([Start new ranger instance only if it's not running in current shell](https://wiki.archlinux.org/index.php/Ranger#Start_new_ranger_instance_only_if_it.27s_not_running_in_current_shell))

```zsh
function ranger() {
    if [ -z "$RANGER_LEVEL" ]; then
        /usr/local/bin/ranger $@
    else
        exit
    fi
}
```

rangerはサブシェルを立ち上げるときに環境変数`$RANGER_LEVEL`にゼロでない値を入れていくので、これによって既にサブシェルの中にいるときに`r`でrangerを起動しようとしたときには一回そのサブシェルを閉じることでrangerの画面に戻るようにしたものが上のスクリプトの意味するところです。

また、これと全く同じようにすれば、自分が今サブシェルにいるかどうかを判定することができるので、プロンプトにこれを表示させれば便利ですね。

* [ranger/bash_subshell_notice.sh at master · hut/ranger](https://github.com/hut/ranger/blob/master/examples/bash_subshell_notice.sh)


```bash
# Compatible with ranger 1.5.3 through 1.7.*
#
# Change the prompt when you open a shell from inside ranger
#
# Add this line to your .bashrc for it to work.

[ -n "$RANGER_LEVEL" ] && PS1="$PS1"'(in ranger) '
```

を参照にすると、サブシェル以下にいないときは

![screen_001.png](https://qiita-image-store.s3.amazonaws.com/0/54869/2985feda-c922-325c-aa14-62cdf1c46205.png)

のように表示されるのに対し、rangerから`S`で抜けた後は

![screen_002.png](https://qiita-image-store.s3.amazonaws.com/0/54869/ee4af831-e3a6-1ea1-bb46-e3912d787362.png)

とプロンプトが表示されて、今自分がrangerの作ったサブシェルの中にいるかどうか分かるようにできます。

> * [dotfiles/prompt.zsh at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/zshfiles/functions/prompt.zsh#L81)

-----

(追記:2015/06/02)

rangerのGitHubリポジトリの[/example](https://github.com/hut/ranger/tree/master/examples)には便利そうなスクリプトが用意されているので、あわせて紹介します。

### 最後に抜けたディレクトリに自動でcd([bash_automatic_cd.sh](https://github.com/hut/ranger/blob/master/examples/bash_automatic_cd.sh))

例えば、`bash_automatic_cd.sh`を、`.bashrc`や`.zshrc`に書いておけば(あるいは`source`コマンドで読みこめば)、ranger-cdという新しい関数がシェルの中で使えるようになります。うまくいかないときは、このスクリプトの中でrangerの実行ファイルのパスが書いてありますが、それが正しいか確認してみてください。シェルの中で`ranger-cd`とすると、普通にrangerが起動しますが、最後に`q`で抜けたところに自動で`cd`してくれ、完全に`cd`の移動の代わりとしてだけでも使うことが容易になります。`ranger-cd`を実行した元のディレクトリに戻りたいときには`cd -`で大丈夫です。

### いいか？俺はemacsを使ってるんだ！という方向け([rc_emacs.conf](https://github.com/hut/ranger/blob/master/examples/rc_emacs.conf))

emacs版キーバインド、あります。rangerでは(多分)すべてのキーバインドが自分で設定できるようになっているので、設定ファイルの該当箇所をemacsライクに書き換えれば(というか上のファイルをコピペすれば)、何も怖いことはありません。どれくらいemacsライクかは分かりません。


### vimの中からでも使えます。([vim_file_chooser.vim](https://github.com/hut/ranger/blob/master/examples/vim_file_chooser.vim))

`vim_file_chooser.vim`というスクリプトファイルがあります。これをvimrcの下の方に書いておけば、vimの中で`<Leader>+r`(`<Leader>`はデフォルトでは`\`)と押せば、その場でrangerが立ち上がり、目当てのテキストファイルにすぐにたどり着くことができます。既に他のVimプラグインのファイラーを使ってらっしゃる方には必要ないかもしれませんが、一応できますよということで。(vim-quickrunと同じキーバインドなので、変えたほうがいいかもです。)


## まとめ

以上、簡単ですがCLIファイルマネージャrangerの紹介と、その設定についてまとめました。ターミナル上で動かすことのメリットはたくさんあると思うので、ちょっとした日々の操作にも、ぜひ使ってみるといいと思います。皆さんのコマンドライン生活が豊かになりますように！