pockestrap

Programmer's memo

Vim からいい感じに tig blame する

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>
  • <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も参照。

http://vim-jp.org/vimdoc-ja/various.html#:!

また、これを付けると CLIVim の場合画面が再描画されなくなるため、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 が効かないのはちょっと悲しい。