携帯パソコンとデスクトップを使い分けていたり、会社や学校で使う計算機と 家で使う計算機が別々だとか言う場合、1つの文書に対して2つのバージョンを 作っちゃうことがあります。
こんなときに、diff で差分を取ってそれを見ながら手で編集するというのは 面倒です。ここら辺をある程度自動化してくれるのが、Emerge です。初めか ら Emacs についています。
ソフトウェア開発なんかで特定の機能を持った別のバージョンを作って安定し てきたら統合するということも普通に行われていることでしょうし、元々はそ のために作られた機能だと思うのですが、住所録や文献データベースなんかの 場合にも便利です。
例として you
と me
という二つの文書を一つに統合したい場合を考えます。この場合、
M-x emerge-files とタイプします。統合する文書
を聞いてきますので、you
と
me
だと答えると、画面が次のように三分割され、
カーソルは下のバッファ (*merge*
という名前が
ついている) に移動します。このバッファは、
you
と me
を適当に
merge した内容になっています。
+-----------------+ | | | | you | me | |-----------------| | | | | +-----------------+
で、you
と me
とい
うバッファを見ながら、*merge*
バッファを編集
していくわけです。以後は you は a, me は b として認識されます。またこ
の時点ではモードラインには diff 0 of 3 のような表示がされているはずで
す。これは、you
と
me
には 3 箇所違うところがあることを示しています。
まずは、n とタイプしましょう。するとモードラインが diff 1 of 3 のように変化し、最初の異なる部分に到達します。
仮に you
と me
の
最初の方が次のような内容だったとしましょう。
○ 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
の方を使うと、次のようなド派
手な画面になります
PNG が表示できない時は、[JPEG 版] (24973byte) をどうぞ。Ediff の説明はここ)
ここで vvv と ^^^ で挟まれた部分が両者が異なる部分で、
*merge*
バッファでは
you
と me
のどちらかが挿入されています。上の場合
モードラインに 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 b や i 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 に加えておきましょう。
何時頃からついたのかは知らないのですが、少なくとも 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 "`'?!:;\"{}[]()「」()?!")
とか書いておくと、かなりましになります。ま、日本語の文法までは認識して くれないので、これでも苦しいには違いないですが。