gitk クローンみたいな Vim プラグイン作った

## agit.vim

![Screenshot from 2014-08-13 21:35:53.png](https://qiita-image-store.s3.amazonaws.com/0/4160/b7fd3a54-6262-87a2-21c5-cd4ef749abf7.png)

上のスクリーンショットのように、Git のログ、カーソル位置のコミットで変更されたファイル一覧、ファイルの差分が1画面で見れます。

[agit.vim](https://github.com/cohama/agit.vim)

同様のプラグインに gitv というのもあります。僕も何度かブログで紹介しています。

- [vim で gitk 的なことを行う gitv が便利](http://cohama.hateblo.jp/entry/20120417/1334679297)
- [tig なんて目じゃない！ Git のログ系 Vim プラグイン gitv ＆ gitv をGit 統合インターフェース化する最強の設定](http://cohama.hateblo.jp/entry/20130517/1368806202)

gitv でも大変便利なのですが、僕にとってはいろいろ不満がありました。
具体例を挙げると

- なんかもっさりしている。とくに Windows で
- マルチバイト文字の扱い
- 変更されたファイル一覧だけ見たいのに見れない (folding でなんとかするしかない)
- Pull Req を送ろうにも、ソースが汚いのと fugitive に強く依存しているので修正が難しい

というわけで、agit.vim では上記の問題点を解決します。

- 割と高速に動作する (fugitive 依存を切ったのとかコマンド見直しとかいろいろ)
- マルチバイト文字も OK
- 変更したファイル一覧も見れる

## 簡単な使い方
Git で管理されているファイルを開いた後、下記コマンドを実行するだけです。

```vim
:Agit
```

agit.vim 用のタブが新規に開かれるのであとは適当にカーソルとか動かせばよいかと。
`q` で終了します。(新しめの Vim の場合は `:q` でもいけます)

Vim のバージョンは少なくとも 7.3.429 で動作することは確認しています。

## いろいろな Git のコマンドを実行する
agit.vim ではログや差分を見るだけでなく、カーソル位置のブランチやコミットなど対して Git のコマンドを発行することもできます。
例えば、カーソルを適当なコミットの上に持って行って `cb` を押下すると、そのコミットの位置に新しいブランチを作成してチェックアウトできます。

![Screen Shot](http://i.gyazo.com/d0895f88bcd15e252017325a01fa89bc.gif)

また、カーソルをブランチの上に持って行って `C` を押すと、そのブランチにチェックアウトすることもできます。
デフォルトでは下記のようなコマンドが実行できます。

| キー   | Git コマンド       | 対象                                |
| ------ | ------------------ | ----------------------------------- |
| C      | `git checkout`     | ブランチ                            |
| cb     | `git checkout -b`  | コミット + 作成するブランチ名を入力 |
| D      | `git branch -d`    | ブランチ                            |
| rs     | `git reset --soft` | コミット                            |
| rm     | `git reset`        | コミット                            |
| rh     | `git reset --hard` | コミット                            |
| rb     | `git rebase`       | コミット                            |
| ri     | `git rebase -i`    | コミット                            |

上記に加え、`git cherry-pick` や `git revert` もできます。これらにはデフォルトのキーマッピングは用意されていないので、vimrc に定義する必要があります。

```vim
" vimrc 設定例
autocmd FileType agit call s:my_agit_setting()
function! s:my_agit_setting()
  nmap <buffer> ch <Plug>(agit-git-cherry-pick)
  nmap <buffer> Rv <Plug>(agit-git-revert)
endfunction
```

さらにさらに、agit.vim では簡単に自分のオリジナルの Git コマンドを簡単に作成する方法も用意する予定です。
(まだ仕様が固まっていない)

## ファイル一覧や差分をウィンドウ切り替え無しでスクロールする
`J` `K` でファイル一覧のウィンドウを半ページ分スクロールできます。
`<C-j>` `<C-k>` で差分のウィンドウを半ページ分スクロールできます。
スクロール幅は現在は半ページ固定ですが、将来的にはオプションで指定できるようにするつもりです。

## 自動更新、手動更新
agit.vim はデフォルトでは、カーソル移動のたびにファイル一覧と差分のウィンドウが更新されます。
また、ログのウィンドウは Git コマンドを実行するか、明示的に `u` を押すと更新されます。

カーソル移動で一覧と差分を更新させたくない場合は

```vim
let g:agit_enable_auto_show_commit = 0
```
とすると、明示的に `<CR>` を押さない限り更新されなくなります。

ログウィンドウは自動更新させることもできます。

```vim
let g:agit_enable_auto_refresh = 1
```
とすると、ログウィンドウにフォーカスが映るたびに更新がはしります。かなり便利なんですが、リポジトリの規模によってはもっさりすることもあるので、デフォルトでは OFF にしてあります。

## 他の Git プラグインとの比較とか
Git のログ見る系プラグインは他にもいろいろあります。agit.vim との違いを簡単にまとめてみました。
### gitv
上でも少し言及しましたが、agit.vim は gitv を完全に置き換える目的で作成しました。
gitv でできることは将来的には agit.vim でもできるようにするつもりです。
今のところ、gitv にあって agit.vim にないのは

- ファイルモード
- ページネーション
- diff を vim の diff で見る

です。

### vim-extradite
1つのファイルについてのログと差分を見ることができます。これも fugitive 依存です。
gitv や agit.vim に比べると機能は少ないですが、その分とても高速に動作します。

### unite-giti / unite-versions
unite.vim のインターフェースを使ってログを見たりブランチの操作ができます。
さらに、ログから絞り込む以外にも、branch や status の一覧から操作を選ぶこともできます。これは agit.vim ではできません。
unite-giti / unite-versions は unite から起動して終わったら閉じられるので、必要なときだけ一時的に立ち上げるというスタイルになるでしょう。目的と対象がはっきりしている場合はこちらの方が無駄がありません。
一方で agit.vim は基本的に最初に起動してあとは都度タブ切替をする、常駐型のスタイルになります。 だらだらとログを眺めるには agit.vim の方が向いています。

## おわりに
というわけで良かった使ってみてください。
まだ作りたてなのでバグ報告や機能要望やプルリクエストはいつでも Welcome です。