line-by-line のビジュアル Merge ツールが欲しい

WinMerge は大好きだけれども WinMerge では出来ないこともある。

要はこんなファイルAとファイルB:

 1 # ...
 2 #: ../../howto/regex.rst:18
 3 msgid "This document is an introductory tutorial to using regular expressions in Python with the :mod:`re` module.  It provides a gentler introduction than the corresponding section in the Library Reference."
 4 msgstr ""
 5 
 6 #: ../../howto/regex.rst:24
 7 msgid "Introduction"
 8 msgstr ""
 9 
10 # ...
 1 # ...
 2 #: ../../howto/regex.rst:18
 3 msgid ""
 4 msgstr "このドキュメントは :mod:`re` モジュールを使って Python で正規表現を扱うための導入のチュートリアルです。ライブラリレファレンスの正規表現の節よりもやさしい入門ドキュメントを用意しています。"
 5 
 6 #: ../../howto/regex.rst:24
 7 msgid ""
 8 msgstr "はじめに"
 9 
10 # ...

これの「Aの msgid を Bにコピー」したり、対応がズレていたらズラして、場合によってはBに新規挿入(msgid, msgstr ともに)、のようなことがしたい。

これ何かってえと、「翻訳」作業な。Aは「原文の英語で書かれた rst から生成した pot」、Bは「rst に直接翻訳を入れてしまった rst から仮で pot を作って、msgid と msgstr を入れ替えた」もの。

原則としてどの「Diff/Mergeツール」も、「diff アルゴリズム」に基いてて、一般的なそれは、「テキストの一致・不一致」に基くわけですな。そうするとさ、何が起こるかと言うと、たとえ行数が双方全く同じで行と行が完全に対応していても、テキストが一致していない行がスキップされて、全然別の行で一致を見つけてしまう、ってこと。こんなね:

なまじ「#:」ではじまるコメントで一致を見つけてしまうもんだから。

それと「マージ作業にかかる編集」という点でも、「diff delta」という考え方そのものがこの場合邪魔なのね。塊でしか「楽な移動」(WinMerge であれば ALT + 矢印キー)が出来ないよね。今の場合 msgid, msgstr の双方が2つのファイルで違うと見做されるわけだから、「msgidからmsgstrの塊」でしか「楽な」移動が出来ない。仕方がないので「左ペインからマウスで必要部分範囲選択してコピー」して、「右ペインにマウスで移動して上書きしたい部分をマウスで選択して上書き」、という、とてもストレスフルな作業を強いられるわけな。

なんてなことは、昔からずっと思っていたことなのだが、今回のこれほど痛烈に感じるものは確かになかったわ。「こういうの、欲しいかも」と思った頻度たるや、これまでは一年に一回でもあれば奇跡的に高確率、くらいに「稀」だったのね。必要としたときだってほとんど一日で用が済んじゃって、そしてまた「いらない一年」が継続する、てな感じ。

ちょっとだけ探してはみたんだけど、見つからないんだなぁ。いくつか WEB ベースのがあったが、左右ファイルを「そのまま文字列として結合」してしまうという、目的には合わないものでさ。いいもん見つかればいいんだけどなぁ。

ワタシは出来れば GUI プログラミングしたくない人なのであまり気は進まないんだけれども、自作するなら、2つのリストボックスを並べて左右に行単位で移動出来て、リストボックスのアイテムの直接編集も出来て、追加挿入も出来る、という感じのシンプルなものを作るかね。今はその気にはなれないけど、本気になればそんなに大変ではない気がする。












15:10追記
SourceGear DiffMerge のこのスクリーンキャプチャ:

をみて、ひょっとしたら目的のことが出来るかな、と思った。

でもね…:

diffmege

prepend (or append) で少しストレス減るかと思ったらむしろ逆だった。結局 WinMerge 等と同じ問題にはまった後の「編集しやすさ」は、大差ない「どころか」なんともウザい。

まずこれ、基本的には商用製品のようで、無料でダウンロードして使えるけれども、「register」は19ドルだってさ。サポートでの商売、かしら? register しないと制限がある、という様子もなさそう。

けどね。「商用製品だから」「フリーだから」という基準はもちろん忘れようぞ。そんなことより、なんかすんげー根本的なこと間違ってないかしら、この子。なんで「Merge」は「3ファイル」で、「Diff」は「2ファイル」なの? Diff、Merge、の意味、わかってないのでは…。ビックリしたよ。マージ作業したいから「Merge」選んだら「3つ選べよゴルぁ」言われて。あのさ、それ、「3-way diff/merge」。しかもこの 3 ペイン構成、あんましユースケース想像出来てなさそう。Center が「Common Ancestor Version」、Left が「First Modified or Branched」、Right が「Second Modified or Branched」なのだと。そりゃそれも一つのユースケースだろうけどさ、そうとばかり使うわけじゃあるめーよ。

上の画像からも察しが付くかもしれない。こやつ、いちいち何かにつけて大声でわめき散らすので、とにかくストレスが溜まる。まず最初にエンコーディングエラーのダイアログが出て、それの「OK」するとエンコーディング選択を求められる。画像で見せたのは「変更しちゃったけど保存するか?」と、たった一箇所変更しただけで聞いてくる。あのねバカですか。こんなん最後にいつどだけきけや。

てわけで、なんかもうアレですよ、使う身になって作ってない感じ。もしくはエンドユーザを馬鹿にし過ぎている。

なんか勿体無いなぁ…。だって「WinMerge に prepend、append があれば!」と思うだけのものではあるもの。あまりにも下らないことで評価落とすぞ、これじゃ。(ついでに言えばなんかリファレンスとても使いにくいぞ、てのは、オマケ中のオマケ。)