vimdiff (vim -d) の使い方
テキストファイルの差分比較するときに便利なvimdiffコマンド
比較だけでなく、行単位で差分をどちらかのファイルに適用したりも出来るので、知っておくと便利です。
案外、vimdiffを知らない人がいたので、ここに記載しておく。
vimdiffコマンドは、vimがインストールされていれば既に使えるようになっているはずで、
vimdiffコマンドの実態は、vim -d
という Diff Mode で起動するようにシンボリックリンクが貼られているだけだからです。(*1)
vimdiffの使い方
使い方はシンプルで比較したいテキストファイルを2つ引数に指定するだけです。
vimdiff a.txt b.txt
起動すると左にa.txt 右にb.txt が表示され、
差分のある行だけ色付きで差分表示されます。
ウィンドウ移動
vim のウィンドウの移動は、Ctrl + w
を押したあと、hjkl
の移動で切り替えられる。
左右に分割されているので、<C-w>h
で左のウィンドウに
<C-w>l
で右のウィンドウに移動ができるというわけだ。
コマンド | 説明 |
---|---|
<C-w>h |
左のウィンドウに移動 |
<C-w>l |
右のウィンドウに移動 |
差分の反映
差分のある行で、do, dp を使うと
差分のかたまりをどちらかのテキストに反映する事ができる。
もちろんvimなので、差分表示中も直接編集することもできますし、
コピー、ペーストで持ってくることもできます。
コマンド | 説明 |
---|---|
do (diff obtain) | 自身側(カーソルのあるウィンドウ)に他方の差分行を持ってくる。 |
dp (diff put) | 自身側(カーソルのあるウィンドウ)から、他方へ差分行を置きにいく。 |
obtain と、put のイメージをもっておけば迷わずに使うことができます。
- obtain ... 持ってくる
- put ... 置きにいく
:help diff
*do*
[count]do 範囲のない ":diffget" と同じ。"o" は "obtain" の意味 ("dgg" と
区別できないので、"dg" は使えない)。Note: これはビジュアル
モードでは機能しない。
[count] を与えた場合、それは ":diffget" に対して [bufspec]引数
として用いられる。
*dp*
[count]dp 範囲のない ":diffput" と同じ。Note: これはビジュアルモードでは
機能しない。
[count] を与えた場合、それは ":diffput" に対して [bufspec]引数
として用いられる。
保存の仕方
vimdiff で編集した際、実際はvimのバッファで開いているだけなので、
編集分は保存して終了する必要があります。
保存しない場合は、:q
もしくは :q!
で閉じればOK。
:w
で保存しても両ファイルが保存されているわけではないので注意が必要です。
あくまで、カレントウィンドウのカレンドバッファが保存されるだけです。
バッファをひとつずつ閉じるのが面倒な場合は、
:a
を組み合わせるといっきに閉じることができます。
コマンド | 説明 |
---|---|
:wa |
すべて保存する |
:qa |
保存せずにすべて終了(編集していた場合、クローズされない) |
:qa! |
保存せずにすべて終了(編集していても変更を破棄してクローズ) |
:wqa |
すべて保存して終了 |
:xa |
変更があればすべて保存して終了 (:wqa とほぼ同じ) |
まとめ
vimdiff file1 file2
で差分比較することができる。- ウィンドウ移動は、
<C-w>h
<C-w>j
で切り替えられる。 do
dp
で差分を適用できる。- バッファ毎に保存して終了する必要があるが、
:xa
でまとめて保存終了できる。
注釈1
vimdiff というvimのシンボリックリンクが、Diff Modeで起動する理由についてはこの記事が参考になります。
argv[0] をみて、コマンド名がvimdiffならという事をしているようです。
http://d.hatena.ne.jp/pneumaster/20081111/1226351072