Emerge Mode

Emerge Mode って何?

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

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

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

使い方

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

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

で、youme というバッファを見ながら、*merge* バッファを編集していくわけです。 以後は you は a, me は b として認識されます。またこの時点ではモードラインには diff 0 of 3 のような表示がされているはずです。 これは、youme には 3 箇所違うところがあることを示しています。

まずは、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, *merge* 各々のバッファの状態は次のような感じに見えているはずです。

     _______________________________________________    
     |<person>               |<person>              |    
     |  <index>dareka        |  <index>dareka       |    
     |vvvvvvvvvvvvvvvvvvvv   |vvvvvvvvvvvvvvvvvvvv  |    
     |  <address>昔の住所    |  <address>今の住所   |    
     |  <date>1996-10-10     |  <date>1997-11-09    |    
     |^^^^^^^^^^^^^^^^^^^^   |^^^^^^^^^^^^^^^^^^^^  |    
     |</person>              |</person>             |    
     |______________________________________________|    
     |[--]E.:--%*-Emacs: you  [--]E.:--%*-Emacs: me |    
     |----------------------------------------------|    
     |<person>                                      |    
     |  <index>dareka                               |    
     |vvvvvvvvvvvvvvvvvvvv                          |    
     |  <address>昔の住所                           |    
     |  <date>1996-10-10                            |    
     |^^^^^^^^^^^^^^^^^^^^                          |    
     |</person>                                     |    
     |______________________________________________|    
     |[--]E.:--%*-Emerge: *merge* diff 1 of 3 - A   |    
     ================================================    

(因みに、ediff-merge の方を使うと、次のようなド派手な画面になります

ediff.png(4873bytes)

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

ここで vvv と ^^^ で挟まれた部分が両者が異なる部分で、 *merge* バッファでは youme のどちらかが挿入されています。 上の場合モードラインに A という表示があることからも分かるように、 you の方の内容が挿入されています。 ここで、b とタイプすれば me の方の内容が挿入されますし、a とタイプすれば、また you の方の内容に戻ります。

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

ところで、これは Fast mode という Emerge mode のサブモードでの動作です。 ここで e とタイプすると Edit mode に移り、より細かな編集が可能になります。 Edit mode では Fast mode でのキーバインドに C-c C-c をつけたキーをタイプすることで、Fast mode での機能が使えます。 特に Fast mode に戻るには C-c C-c f とします。

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

    Do you really want to successfully finish this merge? (y or n)    

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

他にどんなコマンドがあるかは C-h m (describe-mode) を利用したり、Info で Emacs の中の Emerge の項を見ればわかります。 Menu bar を見るのもよいでしょう。 取り敢えず d a, d bi a, i b なんかをチェックしてみて下さい。 また、 x c で両方のバージョンを結合したものを挿入することができます。 その際の形式は emerge-combine-versions-template という変数で定められています。デフォルトは

     "#ifdef NEW\n%a#else /* NEW */\n%b#endif /* NEW */\n"    

になっています。%a, %b が各々 a, b の部分を表し、\n は改行を表すので、これを展開すると、

    #ifdef NEW    
    (a の部分)    
    #else /* NEW */    
    (b の部分)    
    #endif /* NEW */    

と展開されます。 二つのバージョンができるのは普通の文章かせいぜいが個人用のデータベースとかの場合は単に "%a%b\n" とするのもよいでしょう。 もちろん、こうやっていても M-x emerge-set-combine-versions-template で設定を変更することができます。 数値引数を上に与えればバッファローカルな変数として変更するので、頻繁に使うのであれば hook に加えておきましょう。

補足 (Ediff について)

何時頃からついたのかは知らないのですが、少なくとも Emacs-19.34 ベースでは、メニューバーの Tools の Merge から files を選択すると色の派手な Merge mode になります。 ここで実行しているのは C-h k (describe-key) で確認すれば分かるように ediff-merge というコマンドです。 機能的には上で説明した Merge とほぼ同じなのですが、 何せ色がド派手なので、そういうのが好きな人は試して見ると良いでしょう。

もっとも必ずしも派手好きでなくとも、個人的には、merge する時だけでなく単に diff を見たいときにも、ediff みたいに色分けされると大変見やすいと思います。 最近、diff -c で 340 箇所くらいに分割されて違いが表示される二つのファイルを見ながら、その中で 20 箇所ある真に意味のある違いの箇所を探すという作業をやったのだけど、 この色付のお陰で大した苦労もなく作業を終えたのでした。 (専用のスクリプトを使えば、もっと早かったのではないかという意見もあるかもしれないけど、そのスクリプトを作るためには、まず違いをきちっと把握する必要があるので、結局はある程度の手作業が必要になるという状況だった。)

もっとも、日本語の文章の場合、そのままだと一つの段落が一つの単語だと見なされてしまいます。 これは、.emacs

    (setq ediff-word-2 "0-9.,。、")    
    (setq ediff-word-3 "`'?!:;\"{}[]()「」()?!")    

とか書いておくと、かなりましになります。 ま、日本語の文法までは認識してくれないので、これでも苦しいには違いないですが。


[Mule のページに戻る]