パッチのレビューなどでGitの diff の出力を読む機会はそれなりにあると思います。
その際、 diff で列挙されている内容だけでなく前後のコードも確認するために変更のあったファイルを開くことも多々あるでしょう。
Vimにはこの状況にぴったりのコマンドgf
があります。gf
はカーソル下にあるテキストからファイル名らしき文字列を探してそれを開くというコマンドです。
diff の出力には変更のあったファイルのパスが含まれていますから、
そこへカーソルを移動して gf
を使えば良いというわけです。
gf
はとても便利なコマンドではあるものの、
上記の操作を何度か行っていると不満が募ってきます。
というのも、以下のような手間があるからです:
gf
を実行するためにパスの書かれている位置までカーソルを移動しなければならない。gf
でファイルを開いた後、レビューしたい場所までカーソルを移動しなければならない。例えばカレントバッファに以下の内容が含まれているとしましょう
(左端の数字は行番号なので適宜無視してください):
diff --git a/autoload/gf/diff.vim b/autoload/gf/diff.vim
index 469fdb3..b135316 100644
--- a/autoload/gf/diff.vim
+++ b/autoload/gf/diff.vim
@@ -21,7 +22,7 @@
" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"
" Interface
-function! gf#diff#go_to_hunk(type)
+function! gf#diff#go(type)
let d = gf#diff#investigate_the_hunk_under_the_cursor()
if d is 0
echomsg 'There is no diff hunk to jump.'
@@ -113,7 +114,7 @@ function! gf#diff#investigate_the_hunk_under_the_c
return 0
endif
let [d.from_path, d.to_path] = xs
+ call setpos('.', original_position)
- call setpos(original_position)
return d
endfunction
このとき:
gf
をすると autoload/gf/diff.vim
の25行目まで移動する。gf
をすると autoload/gf/diff.vim
の117行目まで移動する。のような感じで 手作業によるカーソル移動なしに目的の位置へ移動 できればとても便利です。
このように gf
の動作を拡張するにはどうすれば良いでしょうか。
vim-gf-diff を使います。
このプラグインをインストールすると gf
や <C-w>f
などのコマンドの動作が以下のように拡張されます:
これでレビューのタスクが山積みになっているときでも安心です。
やりましたね。