パーソナルツール

DirDiff.vim : ディレクトリどうしを、ファイルも含めて、再帰的に比較する

作者: 小見 拓 最終変更 2012年01月08日 11時55分
— カテゴリ:

DirDiff.vimスクリプトは、ディレクトリとディレクトリを再帰的に比較し、 そのディレクトリ以下のコンテンツ、ファイルの違いを表示するスクリプトです。 また、その比較ビューから、ディレクトリ、ファイルを修正する機能も提供します。 (Windows)

概要

DirDiff.vim : A plugin to diff and merge two directories recursively.
http://www.vim.org/scripts/script.php?script_id=102

DirDiff.vimスクリプトは、ディレクトリとディレクトリを再帰的に比較し、 そのディレクトリ以下のコンテンツ、ファイルの違いを表示するスクリプトです。 また、その比較ビューから、ディレクトリ、ファイルを修正する機能も提供します。

説明付き、DirDiff.vimの画面

インストール方法

スクリプトのコピー

vim onlineの DirDiff.vimスクリプト は、日本語版のWindowsで使用する場合は少し問題があったので、
DirDiff.vimの修正版(1.1.0ベース) を作成しました。
このファイルをダウンロードし、pluginディレクトリにコピーしてください。

英語版Windowsの場合は、vim onlineで配布されているDirDiff.vimをインストールしても動作します。

Note

本記事執筆後に、 メッセージを英語化することによる修正を施したバージョン も作成しました。
Windows以外の環境では、こちらのバージョンの方がより動作する率が高いと思うので、
上で紹介したスクリプトが動かない場合は、このバージョンを試してみてください。

環境 ファイル URL
vim online DirDiff.vim http://www.vim.org/scripts/script.php?script_id=102
修正版(日本語メッセージ版) DirDiff_ja.vim https://github.com/taku-o/downloads/raw/master/DirDiff/DirDiff_ja.vim
修正版(メッセージ英語化による修正版) DirDiff_mb.vim https://github.com/taku-o/downloads/raw/master/DirDiff/DirDiff_mb.vim

diffコマンドの実行環境の準備

DirDiff.vimを使用するには更に、diffコマンドが必要となります。
diffコマンドがインストールされていない場合は、 別途diffコマンドを入手、インストールしてください。

参考: Windows環境のvimエディタでdiff機能を使うには

DirDiff.vimの使い方

ディレクトリ比較ビューを表示する

DirDiff.vimスクリプトをインストールすると、 vimエディタコマンドに「:DirDiff」コマンドが追加されます。
この「:DirDiff」コマンドを比較したい2つのディレクトリを引数に呼び出すと、 ディレクトリと、その下層ファイルの再帰的な比較を実行します。

「:DirDiff」コマンドのフォーマットは次の通りです。

:DirDiff {比較したいディレクトリAのパス} {比較したいディレクトリBのパス}

" 「:DirDiff」コマンドの実行例 1
:DirDiff ADir BDir/CDir

" 「:DirDiff」コマンドの実行例 2
:DirDiff C:/ADir C:/BDir/CDir

指定した2つのディレクトリに違いがあるなら、 次のようなディレクトリ以下コンテンツの比較結果画面が表示されます。

ディレクトリの比較結果を表示

ディレクトリを比較した結果、2つのディレクトリに違いが無いなら、 「There is no diff here.」とメッセージが表示されます。
この場合は、ディレクトリの比較結果画面には遷移しません。

2つのディレクトリに違いなしの場合のメッセージ

ディレクトリ比較ビューの見方

ディレクトリの比較画面では、

  • 別ウィンドウに選択したファイルを表示、手作業でファイルの差分を確認する、もしくはマージする。
  • 片方のディレクトリのファイルを、もう片方のディレクトリに移動する。
  • ディレクトリの比較パターンを変更する(diffコマンドのパラメータを変更する)。

といった作業を行えます。

ディレクトリの比較結果画面、説明つき
キー 説明
Enter カーソル位置のファイルを別ウィンドウで開く。
o カーソル位置のファイルを別ウィンドウで開く。「Enter」キーと同じ効果。
s 選択したディレクトリ、ファイルに対し、ダイアログ選択によるマージ処理を実行します。
q ディレクトリの比較画面を終了し、元の画面に遷移します。

手作業でファイルのマージを行う

ディレクトリ比較画面のファイル一覧で「Enter」キーか「o」キーを押すと、
別ウィンドウを開き、そのウィンドウにカーソル下のファイルを表示します。

別ウィンドウでのファイルの比較

コピー、ペーストを使用して、手作業でのマージ作業も行えますが、
vimエディタのdiffモードで用意されているコマンドを利用して、マージ作業を行う事もできます。
用意されているコマンドは次の4つです。

キー 説明
\dg カーソルの無い方にある差分を、カーソルのある方のウィンドウのファイルに取り込む。比較対象の両ディレクトリにファイルが無いと実行できない。
\dp カーソルのある方の差分を、もう片方のウィンドウのファイルに取り入れる。比較対象の両ディレクトリにファイルが無いと実行できない。
\dj 次の行のファイルを表示する。
\dk 前の行のファイルを表示する。

ダイアログ指示によるマージを行う

ディレクトリ比較画面のファイル一覧でファイルを選択し、 「s」キーを押した場合はマージ処理用のダイアログを表示します。
このダイアログを使用して、ディレクトリ間でのファイル、ディレクトリコピー、移動処理を行えます。

ダイアログ選択によるマージ処理

このダイアログの各ボタンと、実行される機能の説明は下の表の通りです。
ビジュアルモードを使用して複数のファイルを選択してから「s」キーを押すと、 一度に複数のファイルに対して処理を実行できます。

選択したボタン ショートカットキー 説明
A -> B a AのファイルでBのファイルを上書きする。Aがディレクトリの場合は、下位ディレクトリのファイルもまとめてBディレクトリに上書きする。
B -> A b 「A -> B」の逆で、BのファイルでAのファイルを上書きする。
Always A l 選択したファイルのうち、未処理分を「A -> B」の定義で処理する。複数ファイル選択時用。
Always B w 選択したファイルのうち、未処理分を「B -> A」の定義で処理する。複数ファイル選択時用。
Skip s 次のファイルの処理に移ります。複数ファイル選択時用。
Cancel n ダイアログを抜けます。

ファイルの比較の条件を変更する

「x」「i」「a」キーを押すと、ディレクトリの比較に使用しているdiffコマンドに渡すパラメータを変更できます。

比較の条件の変更

この機能により設定したパラメータの変更を反映するには、「u」キーを押して画面を更新します。
(再度、比較処理を実行させます。)

キー 説明
u 比較画面を更新する。
x 検索結果の「表示」から指定したパターンの名前のファイル、ディレクトリを除外する。カンマ区切りで複数指定可能。
i 2つのファイルで指定した文字列が含まれる行だけが違っている場合は、違うファイルだとは見なさない。カンマ区切りで複数指定可能。
a ディレクトリ、ファイルの比較に使用しているdiffコマンドに追加のパラメータを渡せる。

ディレクトリどうしの比較を終了する

DirDiff.vimによるディレクトリ比較画面を終了する場合は「q」キーを押してください。 終了確認ダイアログが表示されます。
「Yes」ボタンを押して終了すると、ディレクトリ比較の開始前の画面に戻ります。

終了確認ダイアログ
選択したボタン ショートカットキー 説明
Yes y DirDiff.vimスクリプトによるディレクトリ比較を終了する
No n 終了確認ダイアログのキャンセル

設定

DirDiff.vimスクリプトでは、ディレクトリ、ファイルの比較方法に関する設定と、 ウィンドウの表示に関する設定が用意されています。

設定 説明 設定例
g:DirDiffExcludes 検索結果の「表示」から指定したパターンの名前のファイル、ディレクトリを除外する。カンマ区切りで複数指定可能。 :let g:DirDiffExcludes = "CVS,*.class,*.exe,.*.swp"
g:DirDiffIgnore 2つのファイルで指定した文字列が含まれる行だけが違っている場合は、違うファイルだとは見なさない。カンマ区切りで複数指定可能。 :let g:DirDiffIgnore = "Id:,Revision:,Date:"
g:DirDiffWindowSize ウィンドウの高さ。 :let g:DirDiffWindowSize = 14
g:DirDiffIgnoreCase 比較時に、大文字小文字の違いを無視するかどうか。1をセットすると無視する。 :let g:DirDiffIgnoreCase = 1
g:DirDiffAddArgs このパラメータをセットすると、diffコマンドに追加のパラメータを渡せる。 :let g:DirDiffAddArgs = "-w"

絶対設定しなければいけない、という設定項目はありませんが、
「g:DirDiffExcludes」は設定しておいた便利だとは思います。
設定を有効にするには、vimエディタの設定ファイルに、上表の設定例のように、設定を記述してください。

" 設定例
" CVSと.swpファイルは比較の対象としない。
:let g:DirDiffExcludes = "CVS,.*.swp"
" 空白文字の違いは無視してファイル比較する
:let g:DirDiffAddArgs = "-w"

注意事項など

私のMac OSXの環境ではアプリケーションが落ちてしまったため、 残念ながら、動作確認が取れませんでした。

ドキュメントアクション
コメント
blog comments powered by Disqus