Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

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

$
0
0

前書き

以前、VimでGit連携といえば、fugitiveが定番で(参考1参考2)で、コミットツリーの確認するにはGitv便利、という状況でしたが、最近、次々と新しいプラグインがリリースされていますので、紹介したいと思います。

committia.vim

git commitのコミットログ入力をサポートするプラグインです(紹介記事)。


配布ページより

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

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

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

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

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

vim-merginal

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

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

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

2014-08-04 15_05_05-Merginal_Branches - (~_vimfiles_ftbundle_vim_vital) - GVIM.png
vital.vimのブランチ一覧

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

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

gapply.vim

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

同様の機能は、fugitive の :Gdiffから差分編集することで可能です(参考)。

2014-08-04 17_16_04-vim-git.md (fugitive___C__Users_sugiurms_Work_Qiita_.git__0) - GVIM.png
幅が狭い場合は上下分割

2014-08-04 17_15_36-vim-git.md (~_Work_Qiita) - GVIM.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

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

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

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


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>