TL;DR
git blame
しない人は読まなくていい。nnoremap <F3> :silent! !tig blame +<C-r>=line('.')<CR> %<CR>:redraw!<CR>
.gvimrc
ではnnoremap <F3> :silent! !sakura -x 'tig blame +<C-r>=line('.')<CR> %'<CR>
sakura
は適当なターミナルエミュレータの名前に置き換える。
<F3>
は完全に趣味なので、適当なキーに割り当てればいいと思う。
欲求
以前は普段 git blame
を行うのに tpope/vim-fugitive を使用していた。
ただ、blame 以外に fugitive を一切使っていなかったのでもやもや感があった。できればプラグインへの依存は少なくしたい。
そんな折、tig blame
が便利だという情報を得たので試してみた。
これは Vim から git blame
を呼びだす際のメモ。
方法
TL;DR にも書いたけど、以下の二行が必要。
それぞれ.vimrc
と.gvimrc
に書く。
GVim を使用していなければ後者は要らない。
" in .vimrc nnoremap <F3> :silent! !tig blame +<C-r>=line('.')<CR> %<CR>:redraw!<CR>
" in .gvimrc nnoremap <F3> :silent! !sakura -x 'tig blame +<C-r>=line('.')<CR> %'<CR>
解説
基本的には tig blame <ファイル名>
を呼び出しているだけであるが、いくつか工夫があるので解説する。
:silent!
:silent!
なしで :!tig blame
を実行すると、Press ENTER or type command to continue
と出力され、Enter を入力する必要が出てしまう。
blame する度に Enter を入力するのは大変めんどくさいので、それを回避する為に silent!
を付与する必要がある。
外部プログラムはメッセージを出力するかもしれないので、 外部プログラムを実行した後にスクリーンが再描画されます。 そのため、プログラムの出力を見逃してしまわないように、 hit-enter プロンプトが表示されます。プロンプトを表示し たくない場合は、次のようにします: :silent! !{cmd} これでスクリーンは再描画されません。外部プログラムが何 かを出力した場合は CTRL-L や “:redraw!” で再描画できま す。shell-windowも参照。
また、これを付けると CLI の Vim の場合画面が再描画されなくなるため、redraw!
を実行している。
+<C-r>=line('.')<CR>
tig には +
というオプションがあり、これに行番号をつなげることでその行番号にカーソルが移動した状態で tig が開かれる。
# hoge.rb の 100 行目にカーソルを合わせた状態で blame $ tig blame +100 hoge.rb
このオプションを利用して、Vim で現在カーソルがある行で tig blame を開くようにする。
<C-r>=
は Expression レジスタというもの。
http://vim-jp.org/vimdoc-ja/cmdline.html#c_CTRL-R
.gvimrc
一度 .vimrc
で定義したキーマップを .gvimrc
で再度定義している。
これは GVim で :!tig
とかやると世界が破滅するため。
これを避けるため、GVim ではターミナルエミュレータを呼び出しその中で tig blame
を起動するようにしている。
私は sakura というターミナルエミュレータを使用しているのでそれを使用している。
それ以外は .vimrc
に定義したものとほぼ同じである。
ほぼ同じコードの2重管理になっていてちょっとつらい。
感想
fugitive 捨てられたのでせいせいした。 当然 tig だと使用感は変わるので、慣れる様にしたい。Syntax Highlight が効かないのはちょっと悲しい。