連載が一時終了して一年半以上経過しましたが、晴れて今回復活することになりました。よろしくお願いします。Vim のパッチ [1] を眺めてニヤニヤする、Vim 使いの「ブイ」(仮名)です。第 10 回目のテーマは「diff」です。Vim は外部 diff コマンドを用いて、ソースコードの diff をグラフィカルに表示できます。それだけではなく、パッチの適用なども可能です。
1 vimdiff コマンド¶
開発をしていると、ソースコードの差分を diff コマンドで見ることがたまにあります。
$ diff -u main.c.orig main.c
Vim は diff を表示する機能を備えており、シェル上で “vimdiff” というコマンド (または “vim -d”) を使うと、diff の結果を Vim に表示することができます。
$ vimdiff main.c.orig main.c
画面が小さい場合、Vim が表示されているウインドウを最大化して
<C-w>=
を押すとウインドウが大きくなります。
“vimdiff” はシェル上で実行する diff の代わりとして用いることができるでしょう。Vim はグラフィカルな diff ビューワともなるのです。さらに、Vim で diff を表示するとマージや差分の編集が簡単になります。
2 差分モード¶
diff 連携機能は差分モードと呼ばれています。差分モードを使用するには、”diff” コマンドがシステムにインストールされている必要があります。Windows 環境では標準で “diff” はインストールされていないと思われますので、事前に入手して $PATH の通っているディレクトリか Vim と同じディレクトリにコピーしておきましょう。
:diffsplit {filename}
のコマンドを実行すると、現在開いているバッファと {filename}
で指定されるファイルで差分を表示することができます。既に存在するバッファ間で差分モードを有効にするには、:diffthis
コマンドを用います。差分モードはバッファ単位で記録されています。差分モードを終了するには、それぞれのバッファで :diffoff
オプションを実行します。:diffoff!
コマンドを実行すると、現在のタブページの全てのウインドウで差分モードを終了することができます。
差分モード時の分割方向は、’diffopt’ オプションの設定に依存します。確実に垂直分割したい場合、’diffopt’ オプションの値に “vertical” を含めるか、:vertical diffsplit {filename}
コマンドを実行します。
差分モードでは、バッファ間の違いがグラフィカルに表示されます。さらに、カーソルを移動すると diff を表示しているもう一方のバッファも同時にスクロールします。
3 差分モードのキーマッピング¶
差分モードでは、[c
と ]c
で変更点の移動を行うことができます。[c
はカーソルより前の変更点へ移動し、]c
はカーソルより後ろの変更点へ移動します。
差分の取り込みには、次のキーマッピングを利用します。do
(diff
obtain) のキーマッピングを使用すると、カーソル位置の差分をもう一方のバッファから取り込みます。dp
(diff put) のキーマッピングを使用すると、カーソル位置の差分をもう一方のバッファにコピーします。
これらのキーマッピングを利用すると、Vim を簡易 patch プログラムのように扱うことができます。
次回は「特殊ファイルの編集」について解説する予定です。
[1] | Vim にはパッチバージョンという概念があり、パッチバージョンが上がるごとに、徐々に機能が追加されたりバグが修正されたりします。逆に、メジャーバージョンアップやマイナーバージョンアップは不定期で、数年毎にしかありません。最新の Vim を追い掛けるなら、Vim のパッチ情報を参照しておくのは必須になるのです。 |