🔀

WinMergeのMac/Linux版を作った話

に公開

はじめに

ファイルの差分比較やマージ作業に WinMerge を使っている方は多いと思います。ただ、WinMergeはWindows専用。macOSやLinuxではFileMergeやmeld、vimdiffなどで代用しているケースがほとんどです。

「WinMergeと同じ操作感で、クロスプラットフォームに使えるツールが欲しい」——そんな動機から、WinXMerge を作りました。

https://github.com/masak1yu/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 でお待ちしています。スターをもらえると励みになります。

https://github.com/masak1yu/winxmerge

Discussion