少し前まで、gitのdiffにvimdiffを使う場合、git_diff_wrapperなるファイルを用意して、 .gitconfig[diff]セクションにexternal = git_diff_wrapperとするのが主流だった(と思っている)。

今、各種dotfileを見直している中で、このダサいやり方を改善できないか調べたところ、 今の主流はdifftoolを使うやり方のようなので、乗り換えた。

.gitconfig

まず早速.gitconfigを示す。

[diff]
    tool = vimdiff
[difftool]
    prompt = false

これでOK。ただし、difftoolを使うのでコマンドが変わる。 diffのexternalを変える場合は、あくまでgit diffが使うツールを変更するという意味になるのだが、 diffのtoolオプションを変える場合は、git difftoolが使うツールを指定するという意味になる。

alias化

git_diff_wrapper手法ではgit diffでよかったのに、今回の方法ではgit difftoolと打たないといけないはイマイチなので、 エイリアスを用意する。

[diff]
    tool = vimdiff
[difftool]
    prompt = false
[alias]
    dt = difftool

これでOK。本当はdiff = difftoolとしたかったが、もともと用意されているコマンドを上書きするようなエイリアスは作れないらしい。

リードオンリー解除

さて、これで今までとだいたい同じになったが、カレントのファイルがリードオンリーで開かれるのだけが不満。 diff見ながら手直しするというのはよくあるので、毎回:set noroなんて打ってられない。

なぜか以下のようにしたら解決した。これが完成形。

[diff]
    tool = vimdiff
[difftool]
    prompt = false
[difftool "vimdiff"]
    cmd = vimdiff $LOCAL $REMOTE
[alias]
    dt = difftool

[difftool "vimdiff"]セクションでcmdオプションを指定することで、difftoolで開くコマンドを指定できる。 ここに編集可能な状態で開くオプションを指定すればいいかなと思っていたが、特になんの指定もなくできた。

cmdオプションのデフォルトがどうなってるか知らないけど、リードオンリーな状態で開くようなオプションが指定されているのかな。

関連ポスト