意外と知られていない diff に関する機能

Vim Advent Calendar 2012 の 147 日目の記事です。

137 日目の tyru さんの記事で、Vim の diff 機能について紹介がありました。この記事ではもう少し細かい diff の機能について紹介したいと思います。

:diffthis

比較したい対象がファイルではない場合、例えば、外部からデータを無名バッファにコピーしてきた場合に、それらのバッファの diff を表示したいことがあります。この場合は、:diffsplit は使えません。
こういう場合は :diffthis を使います。diff を適用したいバッファでそれぞれ :diffthis をすると、実行したバッファ同士の差分を見ることができます。

これを利用した設定に、help で紹介されている :DiffOrig があります。(:help :DiffOrig)
これは現在編集中のファイルと、最後に保存したときのファイルとの差分を表示するコマンドです。

command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_
  \ | diffthis | wincmd p | diffthis

現在のタブページに差分の対象にしたいバッファしか開かれていない場合は、:windo diffthis が便利です。

:diffoff

:diffthis で差分を表示した後、元に戻したい場合は :diffoff です。:diffoff! をすると、現在のタブページ内の全ての差分モードを終了します。
ちなみに、:diffthis や :diffoff は実際にはいくつかのオプションを書き換えるだけのコマンドで、その中には 'foldmethod' や 'wrap' なども含まれています。なので、:diffthis :diffoff を実行すると、これらのオプションが実行する前の値から変わってしまう場合があるので注意してください。

:diffupdate

マージ作業をする場合などは、差分をただ眺めるだけでなくバッファを更新していくことになると思います。そして、作業をしていると差分のハイライト表示がおかしくなる場合があります。
その場合、:diffupdate を実行するとハイライトを更新してくれます。

その他

今回は省略しますが、次の差分/前の差分にジャンプしたり、差分を反対側に適用したりすることも可能です。気になる方は :help diff を見てみてください。