56
59

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

agit.vim

Screenshot from 2014-08-13 21:35:53.png

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

agit.vim

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

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

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

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

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

簡単な使い方

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

:Agit

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

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

いろいろな Git のコマンドを実行する

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

Screen Shot

また、カーソルをブランチの上に持って行って 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-pickgit revert もできます。これらにはデフォルトのキーマッピングは用意されていないので、vimrc に定義する必要があります。

" 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 を押すと更新されます。

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

let g:agit_enable_auto_show_commit = 0

とすると、明示的に <CR> を押さない限り更新されなくなります。

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

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 です。

56
59
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
59

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?