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