Ediff

Ediff って何?

携帯パソコンとデスクトップを使い分けていたり、会社や学校で使う計算機と家で使う計算機が別々だとか言う場合、1つの文書に対して2つのバージョンを作っちゃうことがあります。

こんなときに、diff で差分を取ってそれを見ながら手で編集するというのは面倒です。ここら辺をある程度自動化してくれるのが、ediff です。 初めから Emacs についています。

ソフトウェア開発なんかで特定の機能を持った別のバージョンを作って安定してきたら統合するということも普通に行われていることでしょうし、元々はそのために作られた機能だと思うのですが、住所録や文献データベースなんかの場合にも便利です。

雰囲気は以前の emerge-mode と似ていますが、いろいろな面でこちらを使う方が作業が効率良くできるでしょう。

使い方

例として youme という二つの文書を一つに統合したい場合を考えます。この場合、M-x ediff-merge-files とタイプします。 統合する文書を聞いてきますので、youme だと答えると、画面が次のように三分割されます。 下のバッファは、youme を適当に merge した内容になっています。

  +-----------------+  
  |        |        |  
  |  you   |   me   |  
  |-----------------|  
  |                 |  
  |                 |  
  +-----------------+  

また、X 上で作業しているなら新たに frame が出現しますし、テキスト端末で作業している場合は更に最下部に buffer が現われます。ここには異なる部分がいくつあり、現在その何番目にいるかという情報が表示されます。 カーソルもこのバッファに行き、np で次や前の違いがある箇所に移動できます。

で、youme というバッファを見ながら、*merge* バッファを編集していくわけです。 以後は you は a, me は b として認識されます。

左右に分割されると違いが分かりにくいという場合は、| とタイプすると、分割の仕方を左右と上下でトグルできます。

ではまず、n とタイプしましょう。 するとモードラインが diff 1 of 3 のように変化し、最初の異なる箇所に到達します。

仮に youme の 最初の方が次のような内容だったとしましょう。

  ○ you                   ○ me
 |<person>                  |<person>
 |  <index>dareka           |  <index>dareka
 |  <address>昔の住所       |  <address>今の住所
 |  <date>1996-10-10        |  <date>1997-11-09
 |</person>                 |</person>

すると、you, me, *ediff-merge* 各々のバッファの状態はテキスト端末なら次のような感じに、

 _______________________________________________    
 |<person>               |<person>              |
 |  <index>dareka        |  <index>dareka       |
 |->>  <address>昔の住所   |->>  <address>今の住所  |
 |  <date>1996-10-10     |  <date>1997-11-09    |
 |<<-</person>           |<<-</person>          |
 |______________________________________________|
 |[--]E.:--%*-Emacs: you  [--]E.:--%*-Emacs: me |
 |----------------------------------------------|
 |<person>                                      |
 |  <index>dareka                               |
 |->><<<<<<<<<<<<<< variant A                   |
 |  <address>昔の住所                             |
 |  <date>1996-10-10                            |
 |>>>>>>>>>>>>> variant B                       |
 |  <address>今の住所                             |
 |  <date>1997-11-09                            |
 |======== end of combination                   |
 |<<-</person>                                  |
 |______________________________________________|
 | C:[=diff(A+B) combined] -EEE:---F1 *ediff-mer|
 |________________________________? -quick help_|
 |-- *Ediff Control Panel*   diff 1 of 1        |
 ================================================    

また、X 上の Emacs なら次のように見えているはずです。

ediff.png(4873bytes)

PNG が表示できない時は、[JPEG 版] (24973byte) をどうぞ。

*ediff-merge* バッファでは youme の違う部分がそれぞれ variant A と variant B の部分に書かれています。ここで適当に a とか b とタイプすれば、そちらの内容が挿入されます。

もし、主に片方の内容にしたい場合は ediff-files とやった方がいいかもしれません。(merge の最中に片方をデフォルトにする方法は見つけられなかった。) これについては、他にもいろいろと関数があるので、試してみるといいかもしれません。 ディレクトリ単位で差を取る関数なんかも用意されてますし。

適切な方の内容を選択した後は、n をタイプすれば次の異なる部分に移ります。元に戻るには p です。基本的にはこうして次々と選択していくだけです。

中には直接手で変更したい場合もあるでしょう。この場合は直接編集することももちろんできます。

最後に q をタイプすると、

    Quit this Ediff session? (y or n)

と聞いてきますので、y と答えると統合バージョンが *ediff-merge* バッファとして残るので、それを適当なファイルに保存して終わりです。 途中で abort する時は C-] です。

他にどんなコマンドがあるかは C-h m (describe-mode) を利用したり、Info で Emacs の中の Emerge の項を見ればわかります。Menu bar を見るのもよいでしょう。


[Mule のページに戻る]