ページ

2013/07/14

[Vim]vimdiffで差分を表示・マージして元ファイルとの差分を確認する

よく vimdiff で差分を取るのだけれどマージのコマンドを忘れてしまうので備忘録。

vimdiff file1 file2


まあ、これは基本。
初期設定の vimdiff の配色はすごく目に悪い感じだったので .vimrc に以下の設定をした。
hi DiffAdd    ctermfg=black ctermbg=2
hi DiffChange ctermfg=black ctermbg=3
hi DiffDelete ctermfg=black ctermbg=6
hi DiffText   ctermfg=black ctermbg=7
参考: そんな僕らはコピペプログラマー!: vi・vim : vimdiffの色設定

ココから差分を確認してマージしていくにはマージした行にカーソルを合わせる必要がある。
吹き出しの根本がカーソルのある画面。

新規行の右方向のマージ

左画面の新規行にカーソルを合わせて dp


コマンドさえ覚えていればそこまで問題ない。
diff put で dp

変更行の左方向のマージ

左画面の行にカーソルを合わせて do


こちらもコマンドさえ覚えていれば問題ない。
diff obtain で do

変更行の右方向のマージ

左画面の行にカーソルを合わせて dp


変更行の時も新規行と同様にマージしたい行にカーソルを合わせてコマンドを実行するだけ。

新規行の左方向のマージ

右画面の新規行にカーソルを合わせて dp


コレが一番のクセモノ。
dp, do コマンドを実行するにはマージしたい行にカーソルを合わせる必要があるが、
右画面のファイルで新規の場合は左画面のファイルには存在しない行なのでカーソルを合わせることができない。
そのため、右画面へ移動してマージしたい行にカーソルを合わせて dp コマンドで取り込む必要がある。
左画面から右画面への移動は Ctrl + W, Ctrl + W で行う。逆も同様。

左画面の新規行の下の行にカーソルを合わせて do

この記事を書いていて気がついたのだが、
左画面の新規行(カーソルが置けない)の下の行にカーソルを合わせて do コマンドで取り込むことで、
右画面の新規行を左画面にマージすることができる。
わざわざ左画面から右画面へ移動する必要なんてなかった。

元ファイルとの差分を確認する

:DiffOrig


上の vimdiff 画面で右画面へ移動し、 右画面を :q コマンドなどで終了、閉じた後、
:DiffOrig コマンドを実行すると上の画像のようになる。
左下に [Scratch] と書かれている方が元ファイルである。
先ほどと左右が逆になって左画面だった編集後のファイルが右画面になる。
上のマージ操作で取り込んだもの(変更業の左方向のマージ、新規行の左方向のマージ)が差分として現れている。
これで意図しないマージをしていないか確認することができる。

※注意
Vim のチュートリアルと基本設定 | DevAchieveで解説した
$VIMRUNTIME/vimrc_example.vim の設定をしていないと DiffOrig が使えない。
以下が設定してあれば使用できるので設定しておいたほうが良い。
if !exists(":DiffOrig")
  command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
    \ | wincmd p | diffthis
endif

おまけ

差分のある行への移動

] + c : 次の差分の行へ移動
[ + c : 前の差分の行へ移動

参考
2つのテキストファイルの差分をマージする — 名無しのvim使い
最後に保存してから、どのくらい編集したのかの差分を表示 — 名無しのvim使い