このフロントエンドからは、2つのファイルまたはディレクトリの内容を比較し、違いを表示するcygwinツール(http://sources.redhat.com/cygwin/)のdiffプログラムを実行できます。このフロントエンドの「実行」ボタンは、2つの入力が指定されたときに有効になります。
通常のウィンドウ
管のメインダイアログから起動したときのウィンドウ
diffは、2つのファイルか2つのディレクトリを入力として受け付けるという点で、ほかのプログラムとは大きく異なります。そのため、このフロントエンドの入力指定部は、他のフロントエンドとは大きく異なるものになっています。
「ファイル1」か「ファイル2」を押すと、標準の「ファイルを開く」ダイアログボックスが表示されます。何らかのファイルを選択して「OK」ボタンを押すと、読み出し専用エディットボックスに選択したファイルが表示され、「フォルダ1」、「フォルダ2」ボタンは無効になり、「クリア」ボタンを押すまで有効になりません。エクスプローラから1個のファイルをドラッグドロップしたときも同じ効果が得られます。
「フォルダ1」か「フォルダ2」を押すと、標準の「フォルダの参照」ダイアログボックスが表示されます。何らかのディレクトリを選択して「OK」ボタンを押すと、読み出し専用エディットボックスに選択したディレクトリが表示され、「ファイル1」、「ファイル2」ボタンは無効になり、「クリア」ボタンを押すまで有効になりません。エクスプローラから1個のファイルをドラッグドロップしたときも同じ効果が得られます。
エクスプローラから2個のファイルか2個のディレクトリをドラッグドロップすると、その前にどのようなファイル、ディレクトリが指定されていたかにかかわらず、2つの読み出し専用エディットボックスにそれらのファイルまたはディレクトリが表示され、ファイルをドロップしたときにはフォルダ関連のボタン、ディレクトリをドロップしたときにはファイル関連のボタンが無効になります。
ファイルを選択できる状態になっているときには、「ファイル2」としてクリップボードの内容を使うことができます。
他のフロントエンドの入力指定方法の詳細については、「入力の指定」を参照してください。
このページでは、主として違っていても違っていないものと見なす基準を指定します。
-i 大文字か小文字かの違いを無視します。
-w 空白を取り除いてから行を比較します。
-b 空白文字の数の違いを無視します。たとえば、次の2つの行(2行目はstdとioの間にスペースが1つ入っている)は、-wオプションでは同じものと見なされますが、-bオプションでは異なるものと見なされます。
#include “stdio.h”
#include “std io.h”
-B 空行の挿入、削除によって解消できる差を無視します。
-I このオプションをチェックすると、下のドロップダウンリストボックスと「追加」、「変更」、「削除」ボタンが有効になります。「追加」ボタンを押すと、次のようなダイアログボックスが表示されます。
■■ダイアログボックスにパターンを入力し、「OK」ボタンを押すと、ドロップダウンリストにそのパターンが追加され、コマンド行に-Iオプションが追加されます。-Iオプションで指定された正規表現を含む行は、ほかの部分が異なっていても、異なる行とは扱われません。
■■「変更」ボタンを押すと、ドロップダウンリストのテキストボックスに表示されているパターンが上記ダイアログボックス内に表示されます。パターンを書き換えて「OK」ボタンを押すと、リスト内のパターンを書き換えることができます。
■■「削除」ボタンを押すと、ドロップダウンリストのテキストボックスに表示されているパターンがリストから削除され、そのパターンのための-Iオプションがコマンド行から取り除かれます。
以下のオプションは、行の比較基準とは無関係です。
--binary バイナリモードでファイルを読み書きします(ファイルを読むときのCR+LFからLFへの変換、ファイルを書くときのLFからCR+LFへの変換を行いません)。
-a テキストファイルのように見えないファイルでも、テキストファイルと同じように扱います。
diffには、デフォルト、コピーコンテキスト、統合コンテキスト、ed、RCS、サイドバイサイド、Cソース、行グループ/行形式の8種類の出力形式があります。このページでは、context、unified、ed、RCS形式と関連オプション、一部のその他のオプションを指定できます。出力形式としてどれかを指定すると、それまで指定されていた出力形式は解除されます。
次のようなファイル(difffe.cpp)と
// difffe.cpp : アプリケーション用クラスの定義を行います。
//
#include "stdafx.h"
#include "difffe.h"
#include "difffeDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDifffeApp
次のようなファイル(difffe.b。非常にわざとらしい変更が加えてある)があるとき、
// difffe.cpp : アプリケーション用クラスの定義を行います。
//
differ
#include "stdafx.h"
#include "difffe.h"
#include "difffeDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
add
/////////////////////////////////////////////////////////////////////////////
// CDifffeApp
出力形式オプションを指定しなければ(diff difffe.cpp difffe.b)、次のような出力が得られます。
3c3
<
---
> differ
7d6
<
13a13
> add
-c コピーコンテキスト形式を使って表示します。この形式は、まず、次のように2つのファイルの変更日時を表示します。
*** C:\from.txt Mon Oct 01 06:59:55 2001
--- C:\to.txt Mon Oct 01 07:01:02 2001
■■その後ろに、異なる行とその前後の行(コンテキスト行と呼びます。文脈: コンテキストを知るための行という意味です)が次のような形式で表示されます。
***************
*** 1,9 ****
// difffe.cpp : アプリケーション用クラスの定義を行います。
//
!
#include "stdafx.h"
#include "difffe.h"
#include "difffeDlg.h"
-
#ifdef _DEBUG
#define new DEBUG_NEW
--- 1,8 ----
// difffe.cpp : アプリケーション用クラスの定義を行います。
//
! differ
#include "stdafx.h"
#include "difffe.h"
#include "difffeDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
***************
*** 12,15 ****
--- 11,15 ----
#endif
+ add
/////////////////////////////////////////////////////////////////////////////
// CDifffeApp
■■***************で塊を区切り、***で始まる行は第1ファイル、---で始まる行は第2ファイルからの行であることを示します。***、---のあとの数字は、何行目から何行目までかを示します。両方のファイルで同じ内容の行の先頭には2個のスペース文字が付加されます。第1のファイルのみに含まれる行の先頭には-とスペース、第2のファイルのみに含まれる行の先頭には+とスペース、両方で内容の異なる行の先頭には!とスペースが付加されます。+、-、!で表示すべき行を持たない部分は、省略されます(上の例の場合、第1のファイルの12行目から15行目)。コンテキスト行の行数は、-cを指定するためのチェックボックスの右側にあるエディットボックスで指定します。デフォルトは3行です。上の出力は-c2、すなわちコンテキスト行を2行にして得たものです。
-u 統合コンテキスト形式を使って表示します。この形式も、-cと同様に、まず次のように2つのファイルの変更日時を表示します。
--- c:\from.txt Mon Oct 01 06:59:55 2001
+++ c:\to.txt Mon Oct 01 07:01:02 2001
■■その後ろに、異なる行とその前後のコンテキスト行が次のような形式で表示されます。
@@ -1,9 +1,8 @@
// difffe.cpp : アプリケーション用クラスの定義を行います。
//
-
+differ
#include "stdafx.h"
#include "difffe.h"
#include "difffeDlg.h"
-
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -12,4 +11,5 @@
#endif
+add
/////////////////////////////////////////////////////////////////////////////
// CDifffeApp
■■@@ @@で塊を区切り、@@と@@の間には、第1のファイル(-)で何行目から何行目、第2のファイル(+)で何行目から何行目かを示します。両方のファイルで同じ内容の行の先頭には1個のスペース文字が付加されます。第1のファイルのみに含まれる行の先頭には-、第2のファイルのみに含まれる行の先頭には+が付加されます。先頭が+の行を読み飛ばせば第1のファイル、先頭が-の行を読み飛ばせば第2のファイルの内容になります。コンテキスト行の行数は、-uを指定するためのチェックボックスの右側にあるエディットボックスで指定します。デフォルトは3行です。上の出力は-c2、すなわちコンテキスト行を2行にして得たものです。
-L コピー/統合コンテキスト形式のヘッダで、ファイル名の代わりにここで指定したラベルを使います。-u -L"first" -L"second"を指定すると、ヘッダは次のようになります。
--- first
+++ second
-F コピー/統合コンテキスト形式で、データの塊を区切る行(***************か@@ @@)の右に、下のドロップダウンリストに含まれる正規表現にマッチした最後の行の一部を表示します。ドロップダウンリストボックスの操作方法は、-Iオプションと同じです。
-p –F”^[_a-zA-Z$]”と同じ。C/C++言語ソースコードファイルを処理している場合、両ファイルで異なる行が含まれる関数名が***************か@@ @@の右に表示されることになります。ただし、-Fオプションとは異なり、このオプションを指定したときには、-cか-uを指定していない場合でも、-cオプションが暗黙のうちに指定されるようです(このフロントエンドでは、-cか-uを指定していなければ-pオプションは指定できないようになっています)。
-q 出力形式が何であれ、2つのファイルに異なる行が含まれるかどうかだけを出力します。両方のファイルの内容が同じなら、出力はありません。異なる場合には、次のような出力が得られます。
Files C:\from.txt and C:\to.txt differ
-e ed形式で出力します。この形式の出力は、UNIXの行エディタ、edに渡すと、第1のファイルから第2のファイルを生成することができます。追加、削除処理によって行番号に影響が出ないようにするために、末尾に近い方の変更から順に並べられます。同じサンプルファイルを使って、-eオプションを指定したときの出力は、次のようになります。
13a
add
.
7d
3c
differ
.
■■13行目に「add(改行)」を追加し、7行目を削除し、3行目を「differ(改行)」に置き換えるという意味です。ピリオドが1つだけの行(上の例の3行目や7行目を参照)は、入力終了を表すという特別な意味を持っていますので、第2ファイルのみにそのような行が含まれている場合には、次のような処理が行われます。
15a
..
.
16s/^\.\././
■■15行目の後ろにピリオド2個の行を追加し(1、2行目)、入力を終了した(3行目)あと、16行目(15行目の後ろなので16行目になる)の2個のピリオドを1個に置き換えています(4行目)。
■■さらに、edは、改行コードのない行を処理できません。そのため、どちらかのファイルの末尾が改行コードになっていない場合には、末尾に改行コードを挿入したことを示す次のメッセージを出力した上で、行を比較します。
diff: No newline at end of file C:\from.txt
-n RCS形式で出力します。この形式は、Revision Control System(RCS)で使うことができます。ed形式とは異なり、入力終了を示すためにピリオドが1個の行を使っておらず、改行コードの有無の影響も受けません。同じサンプルファイルを使って、-nオプションを指定したときの出力は、次のようになります。置換を削除と追加によって表現していることに注意してください。
d3 1
a3 1
differ
d7 1
a13 1
add
このページでは、サイドバイサイド、Cソース形式と関連オプション、一部のその他のオプションを指定できます。出力形式としてどれかを指定すると、それまで指定されていた出力形式は解除されます。
-y サイドバイサイド形式で出力します。この形式は、第1のファイルと第2のファイルを横に並べるもので、横幅が大きくなります。同じサンプルファイルを使って、-yオプションを指定したときの出力は、次のようになります。2つ目のファイルからの行の前に、|(変更)、<(削除)、>(追加)の記号が付けられています。
// difffe.cpp : アプリケーション用クラスの定義を行います。 // difffe.cpp : アプリケーション用クラスの定義を行います。
// //
| differ
#include "stdafx.h" #include "stdafx.h"
#include "difffe.h" #include "difffe.h"
#include "difffeDlg.h" #include "difffeDlg.h"
<
#ifdef _DEBUG #ifdef _DEBUG
#define new DEBUG_NEW #define new DEBUG_NEW
#undef THIS_FILE #undef THIS_FILE
static char THIS_FILE[] = __FILE__; static char THIS_FILE[] = __FILE__;
#endif #endif
> add
--width サイドバイサイド形式の横幅を指定します。デフォルトは130桁です。
--left-column サイドバイサイド形式で、共通行は左側のみに表示するようにします。
// difffe.cpp : アプリケーション用クラスの定義を行います。 (
// (
| differ
#include "stdafx.h" (
#include "difffe.h" (
#include "difffeDlg.h" (
<
#ifdef _DEBUG (
#define new DEBUG_NEW (
#undef THIS_FILE (
static char THIS_FILE[] = __FILE__; (
#endif (
(
> add
--suppress-common-lines サイドバイサイド形式で、共通行を表示しません。
| differ
<
> add
-D Cソース形式で出力します。この形式は、#ifdef文を使って第1のファイルと第2のファイルを統合します。#ifdef文は、空のラベルでは意味を持ちませんので、右側のエディットボックスにラベルを入力するまでは、コマンド行には-Dオプションは追加されません(もっとも、スペースを入力しただけでも-Dオプションは付加されますし、diff.exeも動作しますが、当然ながらこれでは意味のある出力は得られません)。同じサンプルファイルを使って、-D “FIRST”オプションを指定したときの出力は、次のようになります。そもそも、このサンプルの2つ目のファイルはCソースコードとしては無意味ですが、この出力を見ただけでも、-Dオプションを指定するときには、-B、-Iなどのオプションを駆使して無視できる差異を無視するようにすべきだということがわかります。
// difffe.cpp : アプリケーション用クラスの定義を行います。
//
#ifndef FIRST
#else /* FIRST */
differ
#endif /* FIRST */
#include "stdafx.h"
#include "difffe.h"
#include "difffeDlg.h"
#ifndef FIRST
#endif /* not FIRST */
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifdef FIRST
add
#endif /* FIRST */
以下のオプションは、任意の出力形式オプションと組み合わせて使えます。
-l 出力をprプログラムに渡して整形します。同じドライブの\binディレクトリにpr.exeを格納しておかないと、正しく動作しません。pr.exeは、ftp://sources.redhat.com/pub/cygwin/latest/のtextutils<ver>.tar.gzファイル(<ver>の部分は、バージョン番号)に含まれています。
-t 出力に含まれるタブをスペースに展開します。出力をexpand.exe(展)に渡すのと同じです。
-T 出力の行頭のスペースをタブに置き換えます。デフォルト、コピーコンテキスト、統合コンテキスト形式のみで有効です。
以下のオプションは、プログラムの内部動作を変更するもので、目に見える効果が現れない場合があります。
--horizontal-lines 双方のファイルの差異部の前後にある共通部分を指定された行数だけ保存します。
-d 小さな差異をできる限り見つけるようにします(速度が遅くなることがあります)。
-H 小さな差異を大量に持つ大きなファイルを高速に処理できるようにします
このページでは、2つのディレクトリを比較するときに使われるオプションを指定できます。
-r サブディレクトリが見つかったらそのなかのファイルも調べます。サブディレクトリのなかにさらにサブディレクトリが含まれている場合には、それらのディレクトリも処理します。
-N 片方のディレクトリにしか含まれないファイルがあるとき、もう片方のディレクトリに同名の空のファイルがあるのと同じように動作します。
-P 第1のディレクトリにしか含まれないファイルがあるとき、第2のディレクトリに同名の空のファイルがあるのと同じように動作します。
-s 2つのファイルが同じときでも、同じだということを報告します(このオプションを指定しなければ、同じファイルについての情報は表示されません)。
-x 下のドロップダウンリストに含まれるパターンにマッチする名前を持つファイルを比較の対象から除外します。ドロップダウンリストボックスの操作方法は、-Iオプションと同じです。
-X –xオプションと同様ですが、右のエディットボックスで指定されたファイルを使ってパターンを指定します。
-S 比較を開始するファイルを指定します(アルファベット順ですが、大文字で始まるファイルは、小文字で始まるどのファイルよりも「前」と見なされます)。
このページでは、行/行グループ形式のオプションを指定できます。上半分が行グループ、下半分が行の表示形式を指定するためのオプションです。このページのチェックボックスのなかのどれかをチェックすると、それまで指定されていた出力形式は解除されます。
行グループとは、2つのファイルに含まれている行を第1のファイルのみに含まれているもの、第2のファイルのみに含まれているもの、両方のファイルに含まれているが内容の異なるもの、両方の含まれている共通行の4種類に分類したものです。行グループ/行形式の出力を指定するときには、まず行グループの形式を指定してから、行グループのなかで指定した%>、%<、%=のために行形式を指定します。--new-line-formatは%>、--old-line-formatは%<、--unchanged-line-formatは%=の形式を指定します。ですから、たとえば行グループに関しては--unchanged-group-format=%<だけを指定しながら、--unchanged-line-formatを指定しても、%=を使っている行グループがないので無意味です。
--changed-group-format 第1のファイルと第2のファイルの両方に含まれている異なる行のグループの形式を指定します。これを指定していないときには、--old-group-formatと--new-group-formatの組み合わせが使われます。
--new-group-format 第2のファイルのみに含まれている行のグループの形式を指定します。特に指定しなければ、--unchanged-group-formatが指定されている場合にはそれが使われ、そうでない場合には%>が使われます。
--old-group-format 第1のファイルのみに含まれている行のグループの形式を指定します。特に指定しなければ、--unchanged-group-formatが指定されている場合にはそれが使われ、そうでない場合には%<が使われます。
--unchanged-group-format 第1のファイルと第2のファイルの両方に含まれている共通行のグループの形式を指定します。特に指定しないときには、デフォルトで%=が使われます。
行グループの形式指定文字列では、次のマクロを使えます。その他の文字(%が付けられていても、マクロとして解釈できない文字も含む)は、文字通りに出力されます。
%< 第1のファイルの行を集めたもの。--old-line-formatの展開結果の塊。
%> 第2のファイルの行を集めたもの。--new-line-formatの展開結果の塊。
%= 第1のファイルの行を集めたもの。--unchanged-line-formatの展開結果の塊。
%% %文字
%c'C' Cの部分には、シングルクオート、バックスラッシュ(\)以外の1字を入れることができます。その文字自体を示します。主として、後述の%(A=B?T:E)でコロンの文字自体を使いたいときに使われます。
%c'\0' 0の部分には、3桁以内の8進数を入れることができます。その8進数が表す文字を表現できます。たとえば、%c'\012'は改行文字、%c'\011'はタブを表します。
%FN Fの部分には、C、C++言語ランタイムライブラリのprintf関数の整数用変換指定文字が使え、Nの部分には2つのファイルの行数、行番号を示す以下の文字が使えます。全体としては、Nが指定する数値をFで整形した結果という意味になります。
■■■Fの部分は、{フラグ}{桁数}{精度}{型}の4つの部分から構成されており、型以外は省略できます。
■■■フラグは-か0で、-を指定すると数値は左詰めになります。精度が指定されていないときに0を指定すると、桁数に満たない部分に前0が付加されます。
■■■桁数は数値のために最小限確保される桁数を指定します。
■■■精度は、ピリオド+数字という形式で最小限表示される桁数を指定します。
■■■型として指定できるのは、d(10進)、o(8進)、x(小文字16進)、X(大文字16進)の4種類の文字のなかのどれかです。
■■■Nの部分は、小文字なら第1のファイルの行数または行番号、大文字なら第2のファイルの行数または行番号を示します。それぞれ5種類ずつの数値を指定できます。fまたはFはグループの先頭行の行番号、lまたはLはグループの最後の行の行番号、nまたはNはグループの行数(l-f+1、L-F+1)、e(E)はf-1(F-1)、m(M)はl+1(L+1)です。
%(A=B?T:E) A、Bの部分には、上記のf、l、n、e、mとその大文字版の5種類の文字か、10進整数定数を指定できます。AとBが等しければT、等しくなければEに置き換えられます。たとえば、%(N=0?no:%dN) line%(N=1?:s)は、第2のファイルの行数が0ならno lines、1なら1 line、2なら2 linesに展開されます。
行形式を指定するオプションのうち、3種類についてはすでに説明しました。--line-formatは、すべての行の形式を指定するもので、ほかの行形式オプションを指定すると、diff: conflicting line formatという警告メッセージが表示され、--line-formatの指定内容は無視されます。
行形式指定文字列では、次のマクロを使えます。その他の文字(%が付けられていても、マクロとして解釈できない文字も含む)は、文字通りに出力されます。
%l 行末の改行(ある場合)を取り除いた行の内容。
%L 行末を特に処理しない行の内容。
%% %文字
%c'C' Cの部分には、シングルクオート、バックスラッシュ(\)以外の1字を入れることができます。その文字自体を示します。主として、後述の%(A=B?T:E)でコロンの文字自体を使いたいときに使われます。
%c'\0' 0の部分には、3桁以内の8進数を入れることができます。その8進数が表す文字を表現できます。たとえば、%c'\012'は改行文字、%c'\011'はタブを表します。
%Fn Fの部分には、C、C++言語ランタイムライブラリのprintf関数の整数用変換指定文字が使えます。nは、行番号を示します。つまり、Fで整形した行番号という意味になります。
行形式は、特に指定しなければ、%l%c'\012'です。
たとえば、次のように指定すると、デフォルトの出力と同じものが得られます。
--changed-group-format="%df%(f=l?:,%dl)c%dF%(F=L?:,%dL)%c'\012'%<---%c'\012'%>"
--new-group-format="%dea%dF%(F=L?:,%dL)%c'\012'%>"
--old-group-format="%df%(f=l?:,%dl)d%dE%c'\012'%<"
--unchanged-group-format=""
--new-line-format="> %l%c'\012'"
--old-line-format="< %l%c'\012'"
次のように指定すると、行グループと行の関係がよくわかるはずです。
--changed-group-format="changed group%c'\012'%<%>"
--new-group-format="new group%c'\012'%>"
--old-group-format="old group%c'\012'%<"
--unchanged-group-format="unchanged group%c'\012'%="
--new-line-format="> %l%c'\012'"
--old-line-format="< %l%c'\012'"
--unchanged-line-format="| %l%c'\012'"
通常、出力ファイル名を指定する必要はありません。指定しなければ、出力は一時ファイルに書き込まれ、その一時ファイルが指定されたテキストエディタによってオープンされます。しかし、ファイル名を指定すれば、出力はそのファイルにリダイレクトされ、テキストエディタにもそのファイルが渡されます。また、中央のエディットボックスにファイル名が表示され、その下の「追加」チェックボックスをチェックできるようになります。「追加」チェックオックスをチェックすると、そのファイルの元の内容の末尾に出力を書き足します。出力の指定方法の詳細は、「出力の指定」を参照してください。
出力グループボックスの下の行には、組み立てたコマンド行が表示されます。管(pipeline)の「編集」ボタンで起動したときを除き、コマンド行の左側の四角形をマウスでクリックしてドラッグしていくと、他の差、管、行(cmdline)にドロップできます。また、「コピー」ボタンを押すと、コマンド行情報がクリップボードにセットされます。クリップボードにコマンド行情報がセットされているときに、マウスの右ボタンをクリックし、コンテキストメニューから「貼り付け」を選択すると、クリップボードのコマンド行情報が反映されます。ドラッグアンドドロップとコピーアンドペーストの詳細は、「ドラッグアンドドロップとコピーアンドペースト」を参照してください。エキスポート、インポートされるときのコマンド行情報の形式については、「コマンド行情報のやり取りの仕組み」を参照してください。さらに、「.batロード」、「.bat保存」ボタンを使えば、同じ形式のコマンド行情報を.batファイルとして保存し、あとでロードすることができます。このロード、保存機能の詳細は、「.batファイルのロードと保存」を参照してください。
「設定」ボタンを押すと、「設定」ダイアログボックスが表示されます。このダイアログボックスでは、
出力の表示に使うテキストエディタ
スクリプトの編集に使うテキストエディタ
エクスプローラなどからファイルやフォルダをドロップしたときの確認メッセージの有無
出力の末尾に実行したコマンド行、実行時間などを付加するかどうか
コマンド行プログラムに渡すファイル名のディレクトリ区切り子を\ではなく/にするかどうか
コマンド行プログラムに渡すファイル名を8.3形式にするかどうか
コマンド行プログラムとしてどれを使うか
を指定できます。詳しくは、「設定ダイアログボックス」を参照してください。
「opt保存」ボタンを押すと、「オプション」グループボックス内の設定が保存されます。詳しくは「オプション保存」を参照してください。