WinMergeのMac/Linux版を作った話
はじめに
ファイルの差分比較やマージ作業に WinMerge を使っている方は多いと思います。ただ、WinMergeはWindows専用。macOSやLinuxではFileMergeやmeld、vimdiffなどで代用しているケースがほとんどです。
「WinMergeと同じ操作感で、クロスプラットフォームに使えるツールが欲しい」——そんな動機から、WinXMerge を作りました。
WinXMerge とは
WinMergeのUXを参考に、Rust + Slint UI で作ったオープンソースのdiff/マージツールです。macOS・Linux・Windowsで動作します。

できること
ファイルの2-way diff
左右2ペインでファイルを比較します。
- 差分ブロック単位でのナビゲーション(前へ・次へ・最初・最後)
- 行レベル・単語レベルの差分ハイライト
- 移動行の自動検出(青色でハイライト)
- 左右のスクロール同期
- ミニマップ(ロケーションペイン)で差分位置を一覧表示
マージ操作は差分ブロック単位で左→右・右→左にコピーできます。Cmd+Z でアンドゥも可能です。
3-way マージ
Left / Base / Right の3ペイン表示で、コンフリクト箇所を赤くハイライト。L/Rボタンで片方を選ぶか、両側が同じ変更なら自動マージします。
Gitのmergetoolとして使う場合はこちらが活躍します。
git config --global merge.tool winxmerge
git config --global mergetool.winxmerge.cmd 'winxmerge "$BASE" "$LOCAL" "$REMOTE"'
フォルダ比較
ディレクトリ全体を再帰的に比較します。
- ファイルごとに「同一 / 差分あり / 片方のみ」を表示
- ステータスフィルター(All / Identical / Different / Left only / Right only)
- 列ヘッダークリックでソート(名前・サイズ・更新日時)
-
.gitignoreを自動読み込みして除外 - ダブルクリックでファイルdiffビューへ遷移
タブ
複数の比較を同時に開けます。Cmd+T で新規タブ、Cmd+W で閉じる。セッション情報はアプリ終了後も保持されます。
シンタックスハイライト
tree-sitterを使った行レベルのシンタックスハイライト。以下の言語に対応しています。
Rust / JavaScript / TypeScript / Python / Go / C / C++ / Java / C# / Ruby / JSON / YAML / TOML / Markdown
特殊ファイルの比較
テキスト以外のファイルも比較できます。
| ファイル種別 | 比較内容 |
|---|---|
.zip |
仮想フォルダとして展開。エントリの追加/削除/変更を表示 |
.xlsx / .ods
|
スプレッドシートをテーブル表示。変更セルをハイライト |
| 画像(PNG/JPEG/GIF等) | サイドバイサイド+ピクセルレベルdiffオーバーレイ |
画像比較ではブレンドスライダーで差分ハイライトの透明度を調整できます。
レポート出力
差分結果をファイルに書き出せます。
| 形式 | 内容 |
|---|---|
| HTML | ブラウザで見られる差分レポート |
| Excel(.xlsx) | 色付きセルとコメント列つき |
| CSV / JSON | 全タブのコメントをまとめてエクスポート |
その他の機能
| 機能 | 操作 |
|---|---|
| 検索 & 置換 | Cmd+F |
| 行番号ジャンプ | Cmd+G |
| ブックマーク | Cmd+M / F2 |
| アンドゥ / リドゥ | Cmd+Z / Cmd+Shift+Z |
| 差分オプション | 空白・大小文字・空行・改行コードの無視 |
| 行フィルター / 置換フィルター | 正規表現で比較対象から除外・正規化 |
| 文字コード自動検出 | UTF-8、UTF-16、Shift_JIS など |
| テーマ切り替え | ライト / ダーク |
| 言語切り替え | 日本語 / 英語 |
| 自動リスキャン | ファイル変更を2秒ごとに検出して再diff |
| プラグイン | 外部コマンドとのファイルパス連携 |
| 組み込みファイルブラウザ | WSL2などGTKなし環境でも動作 |
Git との連携
difftool / mergetool として設定しておくと、コマンドラインからシームレスに呼び出せます。
# difftool の設定
git config --global diff.tool winxmerge
git config --global difftool.winxmerge.cmd 'winxmerge "$LOCAL" "$REMOTE"'
git config --global difftool.prompt false
# 使い方
git difftool
git difftool main..feature-branch
技術スタック
Rust製で、UIには Slint を使っています。diff計算は similar、シンタックスハイライトは tree-sitter。クロスプラットフォームのネイティブアプリとしてビルドできます。
インストール / 試し方
Releases からmacOS・Linux・Windows向けのバイナリをダウンロードできます。
最新のMacOS版のバイナリ(.app)はこちら
ソースからビルドする場合:
git clone https://github.com/masak1yu/winxmerge.git
cd winxmerge
cargo build --release
cargo run
おわりに
「WinMergeをmacで使いたい」という個人的な動機から始まったプロジェクトですが、気づけばフォルダ比較・3-wayマージ・画像/Excel比較・タブ・シンタックスハイライトと機能が増えていきました。
フィードバックや機能要望は GitHub Issues でお待ちしています。スターをもらえると励みになります。
Discussion