VimプラグインのGit界隈について

# 前書き

以前、VimでGit連携といえば、[fugitive](https://github.com/tpope/vim-fugitive)が定番で([参考1](http://yuku-tech.hatenablog.com/entry/20110427/1303868482)、[参考2](http://cohama.hateblo.jp/entry/20120317/1331978764))で、コミットツリーの確認するには[Gitv](https://github.com/gregsexton/gitv)が[便利](http://cohama.hateblo.jp/entry/20120417/1334679297)、という状況でしたが、最近、次々と新しいプラグインがリリースされていますので、紹介したいと思います。

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

`git log` を見やすく表示するためのプラグインです。

従来より、[gitv](https://github.com/gregsexton/gitv) というプラグインがありましたが、それら機能に加えて、修正されたファイル一覧も見られるようになっています。

また、gitvにあった以下のような難点も改善されています。

 * キーバインドをカスタマイズするために、filetype=gitvのautocmdを作成しなければならない
 * 外部コマンド(git)の実行タイミングの影響かなんかもっさり
 * encodingの設定によっては日本語のコミットログをデコードに失敗して文字化けする

![2015-02-25 14_35_31-[Agit log] 2 - (~_vimfiles_ftbundle_vim_vital) - GVIM.png](https://qiita-image-store.s3.amazonaws.com/0/11139/8110a818-0864-9605-b124-7b7ffeb35e84.png)

参考: [gitk クローンみたいな Vim プラグイン作った](http://qiita.com/c0hama/items/05fadf117c605aa8b592)

# [committia.vim](https://github.com/rhysd/committia.vim)

`git commit` のコミットログ入力をサポートするプラグインです([紹介記事](http://rhysd.hatenablog.com/entry/2014/08/01/222251))。

![](https://camo.githubusercontent.com/6d92a44bbace7c73141e6fa5a7a0c4b68713517d/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f323735333133382f73637265656e73686f745f636f6d6d69747469612e6a7067)
_配布ページより_

従来、差分を確認しながらコミットする場合、`git commit -v`と`-v`オプションをつける必要があり(fugitive を利用する場合は `:Gcommit -v`)、
その場合でもコミットログの入力バッファに追記される形でdiffが表示されるため、視認性が悪いという難点がありました。

その欠点に対し、3ペイン構成で表示することで、視認性の向上が図られています。

- ログ入力
- Diff
- ステータス

Diffが別ウィンドウになったことで、差分をじっくり確認でき、また、カーソルをジャンプして行ったり来たりしながらログを書く必要がなくなります。

また、コミット時にフックをしかけられるようになっており、編集をインサートモードで開始したり、専用のキーマッピングを設定したりと、色々とカスタムできるようです。

# [vim-merginal](https://github.com/idanarye/vim-merginal)

fugitive は編集バッファに対してのサポートがメインなので、Gitの機能のうち、それ以外に関連する部分についてはあまり機能がありません。

Gitvは、そのうちのコミットツリーの表示 (`git log --graph`相当) をサポートするプラグインでした。

この Merginal は、git でのブランチ管理をサポートするプラグインです。

![2014-08-04 15_05_05-Merginal_Branches - (~_vimfiles_ftbundle_vim_vital) - GVIM.png](https://qiita-image-store.s3.amazonaws.com/0/11139/1dd1c883-d1e4-5ee4-e954-e3b5976d19ef.png)
_vital.vimのブランチ一覧_

メインとなる機能は、ブランチの管理(一覧、作成、切替、削除)と、ブランチ間のマージ(およびコンフリクトの解消)です。

fugitive (編集系、コマンド直接実行), gitv (コミットツリー表示、管理), merginal(ブランチ管理) で、VimをGit用のGUIツールとして使うための機能がほぼ網羅されたといって差し支えないのではないかと思います。

# [gapply.vim](https://github.com/AndrewRadev/gapply.vim)

gapply はちょっと毛色の違うプラグインで、`git add -p` を実行するためのものです。

同様の機能は、fugitive の `:Gdiff` から差分編集することで可能です([参考](http://cohama.hateblo.jp/entry/20120317/1331978764))。

![2014-08-04 17_16_04-vim-git.md (fugitive___C__Users_sugiurms_Work_Qiita_.git__0) - GVIM.png](https://qiita-image-store.s3.amazonaws.com/0/11139/e9e56e6b-2941-38ea-839d-c4b455afca25.png)
_幅が狭い場合は上下分割_

![2014-08-04 17_15_36-vim-git.md (~_Work_Qiita) - GVIM.png](https://qiita-image-store.s3.amazonaws.com/0/11139/725d570d-142a-4e69-112e-d700114840d6.png)
_幅が広い場合は左右分割_

この機能はVimのdiff機能を活用しており、`:diffput` (`dp`)、`:diffget`(`do`)を利用して`git add -p`でき、とても便利です。
これはこれでなかなかいいなとは思うものの、diff故に編集中のファイルが下側、Gitのインデックス相当の差分が上側のウィンドウになってしまっており、コミット対象のhunkを下→上(または右→左)の方向で反映させて、上側ウィンドウを`:w`しないといけないため、使いづらく感じます。

それを解消してくれるのが、このプラグインです。

使い方は、シェルでGit管理された任意のディレクトリで`vim +Gapply`を実行するだけです。

![2014-08-04 15_01_31-Gapply (~_Work_Qiita) - GVIM.png](https://qiita-image-store.s3.amazonaws.com/0/11139/fc6a0f24-25f4-cf2a-1c44-80c70e2ff0b5.png)

すると、`git diff`したそのままの画面が表示されます。

その中で、`git add -p`したい差分だけ残した状態にしておき、`:w`でバッファを保存すると、残した部分だけがStagingされます。

シンプルですが、わかりやすい機能です。シェルのエイリアスなんかに登録しておくと便利です(git のサブコマンドにしてもよさそうです)。