この記事は Vim Advent Calendar 2014 の2日目の記事です。
僕が作成した Vim から Git のログを見るためのプラグイン、Agit.vim についてです。
Agit.vim の基本的なことについては以前の記事を参照ください。
ファイルモード
:AgitFile
と実行することにより Agit をファイルモードとして開くことができます。
ファイルモードではリポジトリ全体の履歴ではなく、ある特定のファイルのみの履歴と、その時のファイルの中身を表示します。
また、--file=path/to/file
というオプションで履歴を見たいファイルを指定することもできます。
これだけだとあまり意味はないのですが、後述する unite.vim との連携等 Agit を外部から呼び出したい場合には便利です。
--dir オプション
:Agit --dir=path/to/dir
で指定したディレクトリを起点として Agit を起動することができるようになりました。
起点として、というのは指定したディレクトリが含まれるリポジトリ全体の履歴を見るということです。
これだけだと特に面白くはないのですが、unite.vim 等と連携するなどすればとても便利になります。
例えば、下記のようなコードを vimrc に書きます。
let agit_action = {}
function! agit_action.func(dir)
if isdirectory(a:dir.word)
let dir = fnamemodify(a:dir.word, ':p')
else
let dir = fnamemodify(a:dir.word, ':p:h')
endif
execute 'Agit --dir=' . dir
endfunction
call unite#custom#action('file,cdable', 'agit', agit_action)
こうすると、例えば Unite file_mru
のあと (a
を押してアクションの絞り込みを行い) agit
というアクションを実行することができるようになります。
この場合 agit
アクションは指定したファイル、ディレクトリを起点に Agit を起動します。
(もしかしたらそのうちプラグイン化するかもしれない)
<C-g> でコミットメッセージを echo エリアに出せるようになった
いちにぃさんが要望を出してくれました。
最初は diff エリアにもコミットメッセージ出ているし不要かなとも思ったんですが、ファイルモードではコミットメッセージが出るエリアはないので実装しました。
言い訳のような何か
いろいろ他のことも忙しくてこれくらいしか機能追加できてないんですが、将来的にはファイルだけじゃなくて Author とか日付とかで柔軟に絞り込んだり、diff を Vim の diff 機能を使って表示するとかも実装するつもりです。
実際ファイルモード実装するの簡単だろwとか思ってたんですが、やってみるとかなりの部分で if filemode
みたいなコードが出てきてしまってこれじゃアカンと思ってコード全体をリファクタリングしてから実装にとりかかりました。
(余談ですが gitv.vim はそういうコードになっています)
時間はかかったのですが、そのおかげで今後の拡張が少しやりやすくなったので今後はもう少し開発スピードを上げていきたいです。。。
明日は koron さんです。