やけに丁寧なtigのキーバインド設定ガイド

[やけに丁寧なtigの設定ガイド（表示制御編）](http://qiita.com/yoshikazusawa/items/d99e8b5d6f6a45aa6e2e) で予告したキーバインドについての解説を行います。

キーバインドは突き詰めていくと非常に設定量も多く複雑になり難しくなるため、
本記事ではキーバインド設定の概論にスコープを絞ります。

# tigのキーバインド規則について

tigの基本操作は単一のキー押下に対して割り当てられたアクションを実行するというものです。
一部をhelpビュー ( `h` で表示されます）から抜粋します。

![](http://f.cl.ly/items/230W2L3H3l1G0t3a2i38/1__tig__tig_-8.png)

上記はtigのデフォルト設定に書かれているビューを切り替えるキーバインドです。
キーはcase-sensitiveです。小文字と大文字に独立したアクションになります。

さらに、修飾キーとして `Ctrl` を使ったコンビネーションをサポートします。
たとえば `Ctrl-U` はPageUpに割り当てられています。
![Ctlr-Uの設定](http://f.cl.ly/items/2E2q2M1f0m0e2I0w1Q34/Image%202014-01-28%20at%2010.27.59%20%E5%8D%88%E5%BE%8C.png)

ただし、option/altといった修飾キーや、 `Ctrl-a-b` のような2ストロークキーはサポートしていません。
この規則に則って、以下では独自のキーバインドを設定していきます。

# キーバインドの設定記法

.tigrc にて独自のキーバインド設定を書くことができます。syntaxは以下のとおりです。

> **bind** *keymap* key action

先頭の `bind` がキーバインドの設定を示しています。

`keymap`は指定先のkeymapになりますが、これはtig全体でグローバルに反映されるgenericか、ビュー毎に特化したkeymap（例: `main` と書けばmainビュー専用のキーバインド）になります。

keyには割り当てるキーを書きます。ASCIIの文字（!などの記号も含む）か `Enter, Space, Insert, Delete` といったシンボル名が使えます。
Ctrlを使ったコンビネーションの場合は `^` をつけます。 `Ctrl-a` であれば `^a` です。

actionは実行するアクションを指定します。指定できるのは以下の3種類です。

* tigが用意しているアクション
 * 例: mainビューに移動する `view-main`
* tigの内部コマンド（:で始まる）
 * 例: tig設定ファイルを読み込む `:source SOURCEFILEPATH`
* 外部コマンド（!で始まる）
 * 例: git fetchを実行する `!git fetch`

このうち、外部コマンドでは組み込み変数が用意されていて、外部コマンドにtigの情報を渡すことができます。
変数名は `%(variable-name)` の記法で表され、10数種類が用意されています。
たとえばmainビューで現在のカーソルにあるコミットのIDを示すなら `%(commit)` とします。
これを利用した実例は後述のキーバインド設定例で示します。

# genericなキーバインドを設定してみる

まず試しに以下のキーバインドを設定してみましょう。これは筆者が強くオススメする設定です。

```
# デフォルトの bind generic G !git gc を無効化する
bind generic G none
```

keymapをgeneric（tig全体で有効）に指定して、`G` （大文字のG）を `none` （何もしない）に置き換えています。
なぜかというと、tigのデフォルト設定では `G` は `git gc` の実行になっているのですが、
vim-likeなカーソル移動をデフォルトのキーバインドに持つtigにおいて、
`G` は「最後の行に移動する」というvimのキーバインドと紛らわしいからです。
（vimに慣れているエンジニアであればこの罠にはきっとはまると思います。。）

generic keymapで `G` を無効化したうえで、私は以下の設定でvimに近い操作感を得ています。
```
bind generic g move-first-line
bind generic G move-last-line
```

以上を記載した.tigrcを保存してtigを起動すると設定が反映されているかと思います。
独自のキーバインドはhelpビューでも内容を確認できるので、設定が正しいか確認しましょう。

![helpビューで設定の確認](http://f.cl.ly/items/0Q3y3W3E0z0p0t3N3S3S/Image%202014-01-28%20at%2010.53.34%20%E5%8D%88%E5%BE%8C.png)

# ビューに特化したキーバインドを設定する

ビューに特化したキーバインドの一例もご紹介します。

mainビューからデフォルトのキーバインドでは`H`で遷移できるbranchビューがあります。
![branchビューのサンプル](http://cl.ly/image/0L3Q0m143619/Image%202014-01-28%20at%2011.16.51%20%E5%8D%88%E5%BE%8C.png)

ふだんの開発時、masterから派生してfeatureブランチを作ることが頻繁にあるかと思います。
gitコマンドで書くと `git checkout -b my_feature master` となりますが、
これをtigのbranchビューで実行できるようにしてみます。

```
bind branch n !git checkout -b %(prompt) %(branch)
```

`n` (new branchという意味で割り当てています）に対して外部コマンドとして `git checkout ~` アクションを実行する設定です。
`%(branch)` には現在カーソルがあたっている行のブランチ名が入るので、`n`をmasterブランチカーソル上で叩けば`master`がここに入ります。
`%(prompt)`は外部コマンド実行時にtigがユーザーに入力を指示する機能です。
`n`を叩くとtigのステータス行で入力を求められるので、ブランチ名を記入します。

![promptの表示](http://cl.ly/image/2S3T252x0J0U/Image%202014-01-28%20at%2011.13.30%20%E5%8D%88%E5%BE%8C.png)

これでmasterブランチから派生したmy_featureブランチが作成されました。
![ブランチ作成後のbranchビュー](http://cl.ly/image/0r20093f2Y0u/Image%202014-01-28%20at%2011.15.17%20%E5%8D%88%E5%BE%8C.png)

# おわりに

概論の説明にとどめるため、keymapの名前リストや可能なkeyの名前、tigが用意しているアクション名などは一部のみ紹介しました。
完全な情報は [tigrc(5) Manual Page](http://jonas.nitro.dk/tig/tigrc.5.html)を参考にしてみてください。

機会があれば各ビュー毎にチューニングしたオススメのキーバインドを紹介したいと思います。