WinMergeマル秘テクニック
こんにちは、ゆたかさんです。今回はファイルの差分比較およびマージツールとして定番のWinMergeに関するお話です。
WinMergeとはなにか
WinMerge(ウィンマージ)というのはWindows向けのフリーソフトのことで、ファイルの差分表示やマージが行えるのが特徴です。差分表示するツールとしては、むかしからdiff(ディフ)がありますが、コマンドライン操作となるため、コマンドライン操作が苦手な人には不向きです。WinMergeはGUI操作であるため、コマンドライン操作が苦手な人でも簡単に使うことができます。
WinMergeはオープンソースソフトウェアでもあり、GPLバージョン2というライセンスの元でソースコードが配布されています。開発言語はC++です。つまり、WinMergeのソースコードを自由に改造して、二次配布することができますが、配布の際、改造したソースコードを公開できる状態にする必要があります。
また、ユーザーはWinMergeを使うということは、必然的にGPLバージョン2というライセンスに同意して使っていることになります。ライセンスの詳細はライセンス文を読んでいただくとして、ざっくり言うと、ソフトウェアは無保証であり、すべての責任はユーザーにあるということになります。これはWinMergeに限らず、一般的にどのオープンソースソフトウェアでも同じですが、ソフトウェアを使ったことで何らかの損害が起きたとしても、開発者に対して損害賠償請求を行うことはできないということです。
入手方法
WinMergeは本家版と日本語版のふたつが存在し、それぞれでダウンロード先が異なります。
本家版
https://winmerge.org/?lang=ja
日本語版
https://winmergejp.bitbucket.io/
以前は本家版と日本語版で機能に大きな違いがありましたが、現在では動作上の違いはありません。唯一の違いは、日本語版には日本語ヘルプが付属しているということだけです。なお、日本語ヘルプは本家のヘルプがベースとなっており、所々に原文が残っています。WinMergeの開発はボランティアであるため、開発が人手不足だからというのもあるのでしょう。プログラミングはできなくとも、ドキュメントの修正は誰にでもできるので、開発に協力してみるのも面白いと思います。
本記事執筆時点での最新バージョンは2.16.4です。日本語版の変更履歴を見ると、ソースコードやドキュメントを管理するリポジトリがOSDNに移行したようです。
2019/09/29 2.16.4-jp-5
全般
リポジトリをBitbucket(Mercurial)からOSDN(GIT)に移行しました。
開発の歴史
WinMergeの歴史は古く、最初のリリースは2000年です。西暦2000年(略してY2K)問題が社会現象になった年でもありますが、いまの若い人たちにはなんのことか分からないでしょうが、知らなくていいことです。世の中には知らない方が幸せということもあるのです(謎)。
開発が活発に行われ、リリース頻度も高かったのですが、2009年にリリースされた2.12.4を最後に、しばらくリリースが途絶えます。4年後の2013年に2.14.0がリリースされたものの、その後は新しいバージョンがリリースされる様子がありませんでした。
一般的にオープンソースソフトウェアというと、世界中のプログラマが集まって、大人数で開発をしているというイメージがあります。それは正しくもあり、間違ってもいます。LinuxカーネルやFirefoxなどのような超有名ソフトウエアになると、主開発者は企業からお金をもらいながら、仕事として取り組んでいます。完全なボランティアベースでは、開発を維持するのは大変難しいのです。
超有名ソフトウエアではない、小粒なオープンソースソフトウエアになると、開発の多くはボランティアベースです。開発者は趣味として、本業の片手間で取り組んでいるので、いつか限界が来ます。
ですので、普段使っているオープンソースソフトウェアをよく見てみると、長らくバージョンアップされていない、開発も進んでいない状態になっていることは、よくある話なのです。
けれども、オープンソースソフトウェアはソースコードが開示されており、誰もが自由に改造することができます。ソースコードが残っている限り、誰かがいつでも引き継ぐことができるということです。
閑話休題。WinMergeは本家のバージョンとは別に、Sawanaka Takashiさんという方が2004年から独自に日本語版を開発およびリリースしています。そして、本家のバージョンが2013年に更新が止まっていたにも関わらず、日本語版は開発が継続されていました。
そして、2018年に独自進化した日本語版が本家のバージョンとなったのです。なんという胸熱展開なのでしょう。
そうは言っても、開発の状況を見ていると、Sawanaka Takashiさんがお一人ですべて作業されているようなので、大変そうだなぁと感じています。日本語版だけだったら、日本人のユーザーだけを相手にすればよいですが、本家となると世界中のユーザーを相手にしないといけないので、ユーザー対応も楽ではないでしょう。
差分表示の色を変更する
複数のファイルを比較して、その違い(差分や差異という)を表示すると、デフォルトでは以下のような色になります。
ずっと眺めていると目がチカチカしてくるので、筆者は以下の色設定に変えています。
この色設定は、編集-設定-色ー差異で「GitHub/Bitbucket」で選ぶことができます。
エクスプローラーから差分表示を行う
比較したいファイルが同一フォルダに存在する場合、エクスプローラー上で複数のファイルを選択した状態から、右クリックメニューでWinMergeを起動することができます。
WinMergeを単体で起動した状態では、比較対象となるファイルを選択するダイアログが表示されており、それぞれファイルを選択する必要があります。しかし、上記の方法を使うことで、いきなり差分表示をさせることができるので便利です。
ここでは比較対象としてファイルを例として挙げていますが、フォルダをまるごと比較することもできます。
WinMergeは3ファイルにも対応しているため、比較対象とするファイルやフォルダは2つもしくは3つを指定することができます。
バイナリファイルの比較
比較対象となるファイルはプレーンテキストだけではなく、バイナリファイルにも対応しています。しかしながら、バイナリファイルを比較すると下記のような表示になることがあります。
これはテキストファイルとして比較されているため、このような宇宙文字になるのです。
そこで、ファイル-形式を指定して再比較-バイナリを選ぶことで、バイナリファイルとして比較されます。
バイナリファイルの比較の場合は、16進ダンプ表示となり、差分の比較を行うことができます。
3ファイル比較
通常、ファイルを比較する際、ふたつのファイル同士で行いますが、3つのファイルを比較対象とすることができます。それでは、3つのファイルを使って比較するというのは、どのようなシチュエーションがあるのでしょうか?
上記は左が元のファイル、中央が元のファイルに修正を加えたもの、右が中央のファイルに修正を加えたものです。ひとつのファイルに2回パッチを適用した場合、ファイルの修正内容がどのように変化しているのかを確認することができます。
上記はリポジトリのマージをする作業においてコンフリクトが起きたときのものです。左と中央の表示は「BIGNUM *pubkey;」を適用としたことを表します。右の表示は「int ret;」という内容が、適用しようとした行にすでに存在したという意味です。
つまり、「BIGNUM *pubkey;」を追加したいのだけれど、すでに「int ret;」が存在したので、どちらを優先すればいいのか分からない、だからコンフリクト(競合)したということです。
コンフリクトが起きたファイルを直接エディタで見ると、下記のようになります。こちらのほうが見やすいという方もいらっしゃるかもしれません。
コマンドラインオプション
WinMergeにはコマンドラインオプションを渡すことができます。主に、外部ツールから起動する場合に使います。外部ツールというのはSourceTreeやTortoiseSVNなどのリポジトリ管理ソフトのことです。
-e オプション
-eを指定するとESCキー一発でWinMergeを終了させることができます。通常、WinMergeを起動して比較を行った場合、WinMergeを終了させるにはESCキーを複数回押す必要があります。
上記の状態からESCキーを押すと、以下の状態になります。さらにESCキーを押すと終了します。
外部ツールからWinMergeを起動して差分比較を確認した後、ESCキー1回で終了できると作業効率もよくなります。外部ツールがWinMergeに対応していても、デフォルトでは何もオプションを指定しないものもあるので、カスタム設定しておくと便利です。
-uおよび-ubオプション
WinMergeで何らかの比較を行った場合、ファイルメニューの「最近使用したファイルまたはフォルダー」に使用したファイルが履歴として記録されます。しかしながら、外部ツールからWinMergeを起動した場合、使用されたファイルは外部ツールが作成した一時ファイルであることがあり、履歴に残しても意味がありません。そこで、-u(または-ub)オプションを指定することで、履歴に残さないようになります。
TortoiseSVNではデフォルトではこれらのオプションが指定されるようになっています。外部ツールにより指定されるオプションはまちまちなので、個別に確認が必要となります。
C:\Program Files\WinMerge\WinMergeU.exe -e -ub -dl %bname -dr %yname %base %mine
画像の比較
比較対象に画像ファイルを指定するができます。違いがある画像にはマークが付きます。左のロケーションペインの「点滅」にチェックを入れると、差異の箇所を点滅させることもできます。
Excelの比較
仕様書と言えば、なぜかExcelで作られていることが多いです。正式な文書としてはWordで記載するのが一般的ですが、Excelは手軽に書けるという強みがあります。しかしながら、Wordと違って、変更履歴を残したり、ファイルの差分を取ることができません。そこでWinMergeを使えば、Excelの差分比較を行うことができます。
ここで、上記のように一部違いがあるふたつのExcelファイルを用意します。これらのファイルをWinMergeで開きます。
上記のように文字化けしてしまった場合は、「プラグイン」メニューの「展開プラグインで開く」を選びます。次に、「ファイル展開プラグイン」で「CompareMSExcelFiles.sct」を選択して、OKボタンを押します。
そうすると、以下に示すようにExcelファイルの差分比較を行うことができるようになります。
変更履歴がおもしろい
変更履歴を読むと面白いので、いくつか紹介します。
2018/11/29 2.16.0-jp-1
WindowsXPで起動した場合、ツールバーの現在無効化されているアイコンの色が灰色にならない問題を修正
Windows XPをサポートしているなんて素敵!
Windows XPは永久に不滅です。
ファイル/フォルダ比較: Google Drive File Stream 上の.gdoc, .gslide, .gsheet
ファイルを比較するとクラッシュする問題を修正。(比較はどうしてもできないようなので
クラッシュしないようにだけ対策)
WinMergeでも食べられないものがあるということですね。
ファイル比較: Go言語、Rust言語のシンタックスハイライト機能を追加。C++11のキーワードを追加
オシャレ言語への対応も最高です。
ご連絡いただいた以下の問題を修正
CPUコア数が16を超えるコンピュータ上でフォルダ比較が進まない。
16コアもあるなんて贅沢な環境ですね。
2015/08/29 2.14.0-jp-84
ご連絡いただいた以下の問題を修正
PentiumIIIのマシンで動作しない。(32bit版ではSSE2の命令セットを使用しないようにしました。
2015年にペンスリーとは渋すぎです。
2015/04/29 またもや、バージョン 2.14.0+-jp-80 の64bit版インストーラが
Norton360 で「SAPE.BitCoinMiner.3」が検出されるとご連絡があり、
ダウンロードできないようにしています。(2014/04/26時点では問題なかったのですが...)。
お騒がせして申し訳ございません。現在 False Positive Submission をしているところです。
さすが、我らがノートン先生。
Visual Sourcesafe 連携機能が壊れていたのを修正
Visual Sourcesafe……うっ、頭が
2013/02/12 2.14.0-jp-1
Windows98で動作しなくなっていたので98/ME/2000版サポートを断念
お疲れ様です。
'ケ'と'パ'、'サ'と'フ'、 'ジ'と'ヘ'等が「大文字と小文字を区別しない」場合に同じとみなされる
興味深い問題ですね。
2.12.4+-jp-22 32bit Zip版のMergeLang.dll が古いバージョンになっていました。
ごめんなさい。
いえいえ、謝らなくても大丈夫です。いつもありがとうございます。
改造しすぎた...
ファッ!?
OSがNT系の場合、WinMerge.exeはもはやインストールされなくなったようです
それは寂しいですね。
いまさらながら初期インストール後のあまりの表示のだささに驚愕したので初期パラメータを微調整。
色は...まあいいや
色はええんかいw
おわりに
いかがでしたでしょうか?
普段、なにげなく使っているWinMerge、知らなかった機能の発見があったらならば、筆者として嬉しく思います。
ここから先は
¥ 128
貴重な時間を使って最後まで読んでくださり、ありがとうございました。 よかったら、記事の拡散もお願いいたします。