WinMergeの不思議な動作

ソフトウェア開発の仕事をしていると、異なる環境からのソースコードのマージを行うことが頻繁にあります。

一つのシステムは(通常)複数のソースファイルで成り立ちますが、ファイルが分かれているからと言って、ひとつのファイルを一人しか手を入れることがない、ということもありません。

基幹部分に近いところは、多くのプログラマーが同時に手を加えることもあります。そんなときに役立つのがマージ用のツールです。

WinMerge

WinMerge は、 オープンソースのWindows 用比較・マージツールです。

WinMerge は、フォルダとファイル両方が比較でき、理解しやすく扱いやすいテキスト形式で差異をビジュアルに表現します。

https://winmerge.org/?lang=ja

ソフト開発に携わっていて、WinMergeって何ですか?という方は少ないかと思います。

もちろん、名前の通りWindowsのアプリですから、開発環境がWindowsでなければ縁は無いかもしれないですけどね。

名前に「マージ」と入っていますが、ファイルの差分、フォルダの差分が無いかを見つけ出すためだけにも、役立つツールです。

なので、長年にわたって使っていますが、最近、ちょっと見慣れない挙動に悩まされていました。

Altキーを押してないのに…

WinMergeでは、二つのファイルの差分が、色付きで分かりやすく表示されます。

https://winmerge.org/screenshots/ から引用させて頂きました。

例えばこのような場合、現在、着目している範囲が、ソースコードの上から8行目、背景色が赤色になっているところになります。

この行の差分は、背景色が薄い赤色になっているところ、左が「TRUE」、右が「true」という違いです。

この状態で、[Alt]キー+[→]キーを同時に押すと、左から右へのマージになりますから、右側の「true」の文字が「TRUE」に置き換わり、「差分が無くなった」ということで背景色は白に変わります。

ややこしいので、今のマージは行わなかったことにして話を進めますが、8行目が赤色になっている状態から、[Alt]キー+[↑]キーを押すと、一つ上の差分に選択が移ります。6行目ですね。

「< MAX_PATH)」の行の背景色が赤色に変わります。

逆に、[Alt]キー+[↓]キーを押すと、左側は15行目の「success = CopyFile(~」の行、右側は15行目~17行目の3行が赤色背景に変わります。

ここで[Alt]キー+[←]キーを押すと、15行目と16・17行目のグレー部分が、右側の15~17行目の

{
    sucess = !!CopyFileW(~
}

に置き換わります。

そんなこと知ってるよ、という方が多いと思います。それくらい、有名で便利なツールです。

では、[Alt]キーを押さずにカーソルキーを押すとどうなるか、というと、ごく普通のエディターと同様、カーソルが動きます。

右画面か左画面のどちらかにカーソルがありますので、それが動きます。

[→]を押し続けると、改行コードより右には行かずに、次行の左端に移ります。
何の違和感もないですよね。

ところが、先日、[↓]のカーソルキーだけを押したつもりなのに、一気に次の差分へと選択行が飛んだんです。

おまけに、例えば8行目の「success」の最後の「s」の後ろにカーソルがあったとして、「=」にカーソルを移動させようと[→]キーを押すと、この行が左からマージされ、

success = TRUE;

に書き換わる、と。

要はカーソルキーだけで、「Alt」キーを同時に押したのと同じふるまいをするわけです。

知らなかったモード

ツールを閉じてから再度開いても、PCを再起動しても変わらず。

戻し方が分からないので、いちいちカーソルを「マウスで」移動させる、という苦行を強いられたんです。

「設定」を見ても、それらしい項目もなく。

が、設定ではなく「モード」の違いだったんですね。

「マージモード」。

マージモードはカーソルキーのみでマージしたり、次や前の差異に移動できるモードです。

まったく知りませんでした。。

ステータスバーに「マージ」の文字が…

マージモードをオフにしたい場合は、F9キーを押してください。

確かに、[F9]キーで元に戻りました。

ベテランのチームメイトに聞いてみても「知らなかった」と言ってますし、どれくらい知られてるんでしょうね。

でも、マージモードに切り替えるとき、こんなダイアログが出てたはずなので、なんか、うっかりが重なってしまったのかもしれないですね。

WinMergeの挙動に驚かれた方は、マージモードになっていないか、ご確認を。