Vim のすゝめ

第10回 diff

2015.06.24

連載が一時終了して一年半以上経過しましたが、晴れて今回復活することになりました。よろしくお願いします。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 のパッチ情報を参照しておくのは必須になるのです。
This article is made by Vim.

著者プロフィール

v

ブイ。社内では数少ない Vim 使い。ブログ記事の執筆により、社内でのVim の知名度を上げ、Vim を使用する人を増やそうと計画しているらしい。

記事一覧Index