Vimでファイル間の差分を表示する(vimdiff / :diffsplit)
2つの設定ファイルのどこが違うのか目で追うのは時間がかかります。Vimには標準でdiff機能が組み込まれており、外部コマンドを使わなくても差分箇所を色分け表示しながら比較できます。
| 操作 | これだけ覚える |
|---|---|
vimdiff f1 f2 | 2ファイルを比較しながら開く |
:diffsplit file | 開いているファイルと比較する |
| [c / ]c | 前 / 次の差分箇所へ移動 |
:diffoff | 差分表示を終了 |
ターミナルから直接比較する
vimdiff ファイル1 ファイル2
gvimdiff ファイル1 ファイル2
最大4ファイルまで同時に比較できます。次のコマンドでも同じ動作になります。
vim -d ファイル1 ファイル2
nvim -d ファイル1 ファイル2
デフォルトでは垂直分割(左右並び)で開かれます。分割方向を水平にしたい場合は-oオプションを付けます。
vim -o ファイル1 ファイル2
vimdiff file1 file2が最短です。分割方向を変えたいなら-oを追加します。Vimを開いた状態から比較する
すでに1つのファイルを開いている状態で、別のファイルと比較したいこともあります。
:diffsplit 比較対象ファイルパス
:diffs 比較対象ファイルパス
今開いているバッファと指定したファイルを、水平分割で比較表示します。左右に並べたい場合はverticalを前置します。
:vertical diffsplit 比較対象ファイルパス
:vert diffs 比較対象ファイルパス
差分箇所を移動する
[c " 前(上)の差分箇所へ移動
]c " 次(下)の差分箇所へ移動
ファイルが長い場合、スクロールで探すより]cで差分箇所だけを飛び移ったほうが速くなります。差分をマージしながら確認する作業では、この2つのキーを軸に進めることになります。実際にマージする方法(:diffget/:diffput)は別記事で詳しく扱います。
差分モードを終了する
:diffoff
比較が終わったら、このコマンドで通常の表示に戻せます。全ウインドウの差分表示を一括で解除したい場合は:diffoff!を使います。
diffモードで見やすくする設定
差分表示中は、対応する行の折りたたみが自動的に行われます。変更のない部分をまとめて畳んでくれるので、変更箇所だけに集中しやすくなります。この自動折りたたみが不要な場合は、次の設定でオフにできます。
set diffopt-=foldcolumn
また、空白の違いだけを無視して比較したい場合はdiffoptにiwhiteを追加します。インデントスタイルが混在しているファイル同士を比較するときに、余計な差分に惑わされずに済みます。
set diffopt+=iwhite
設定ファイルを書き換える前に、バックアップとの差分をvimdiffで確認する習慣をつけてから、意図しない変更に気づかず保存してしまう事故がなくなりました。ターミナルでdiffコマンドの出力を目で追うより、色分け表示で該当箇所へ直接ジャンプできるほうが圧倒的に速いと感じます。
まとめ
ファイル間の差分確認はvimdiff、Vimを開いた状態からなら:diffsplitを使います。[c/]cで差分箇所を移動しながら確認すれば、外部ツールなしで十分な比較作業ができます。