/* * バージョン管理システムによる差分を WinMerge などで表示する秀丸マクロ * (Git, Mercurial, Subversion に対応) * * Ver.1.8 (2016-09-27) * * 機能 * - このマクロを実行すると、編集中のファイルの前回のコミットからの差分が * WinMerge などで表示されます。 * - 使用中のバージョン管理システムの種類は、編集中のファイルがあるフォルダを上へと遡り、 * 以下のフォルダの内最初に見つかったものにより判断します。 * - .git * - .hg * - .svn * * 注意 * このマクロを利用するには、事前に WinMerge などの差分表示ツールのインストールと、 * バージョン管理システムへの設定追加(コピペ)が必要です。 * ※以下の導入手順を参照 * * 導入手順 * 1. WinMerge など、お好きな差分表示ツールをインストールする。 * WinMerge (http://winmerge.org/) * 2. Subversion による差分を表示したい場合は、Win32Svn などのコマンドラインクライアント * をインストールする。 * GIT と Mercurial も、もしコマンドラインクライアントがインストールされていなければ、 * インストールしてください。(GIT は msysgit インストール時のオプションで、Mercurial は * TortoiseHg にコマンドラインクライアントが付属しています。) * 3. 利用しているバージョン管理システムに以下の様に設定を追加する。 * 以下は差分表示に WinMerge を使う場合の設定です。 * ※WinMerge のパスが異なる場合には修正してください。 * * - GIT * %USERPROFILE%\.gitconfig に以下をコピペ * * [diff] * tool = WinMerge * [difftool "WinMerge"] * cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -ub -dl Base -dr Mine \"$LOCAL\" \"$REMOTE\" * * - Mercurial * %USERPROFILE%\mercurial.ini に以下をコピペ * * [extensions] * extdiff = * * [extdiff] * cmd.wmdiff = C:\Program Files\WinMerge\WinMergeU.exe * opts.wmdiff = -r -e -x -ub * * - Subversion * 次の一行からなるバッチファイルを作成 * * "C:\Program Files\WinMerge\WinMergeU.exe" -e -ub -dl %3 -dr %5 %6 %7 * * %APPDATA%\Subversion\config ファイルの helpers セクションの diff-cmd キーの値に、 * 作成したバッチファイルのパスを指定 * * * Yasunori Miyamoto * http://tipszone.jp/20121226_vcs_diff/ * mailto: nori@tipszone.jp */ // このマクロが実行された時にここで設定したキーが押されていた場合、 // git の差分表示に --cached オプションを指定します。 // // Shift: 0x10 上: 0x26 下: 0x28 0〜9: 0x30〜0x39 ESC: 0x1B // Ctrl : 0x11 左: 0x25 右: 0x27 A〜Z: 0x41〜0x5A // Alt : 0x12 ※詳しくは秀丸エディタマクロヘルプの iskeydown の項目を参照 // #code = 0x10; // 編集中のファイルが(無題)でまだ保存されていない場合などはマクロを終了 if (leftstr(filetype, 1) != ".") endmacro; if (updated) save; // バージョン管理システムの種類を調べる call DETECT_VCS_KIND; $vcs_kind = $$return; if ($vcs_kind == "") { message "バージョン管理されていないようです。"; endmacro; } // 差分表示コマンドの定義 if ($vcs_kind == "git") { $command = "git difftool -y"; if (iskeydown(#code)) $command = $command + " --cached"; } else if ($vcs_kind == "hg") { $command = "hg wmdiff"; } else if ($vcs_kind == "svn") { $command = "svn diff"; } else { endmacro; } runex $command + " -- \"" + basename2 + "\"", 0, //sync 0:async 1:sync 0, "", //stdin 0:none 1:auto 2:file 3:(reserve) 4:all 5:select 0, "", //stdout 0:none 1:auto 2:file 3:add file 4:new 5:insert 6:replace 7:output frame 0, "", //stderr 0:none 1:=out 2:file 3:add file 4:new 5:insert 6:replace 7:output frame 1, "", //folder 0:none 1:current 2:specify 3:(reserve) 4:exe's folder 2, //show 0:auto 1:show 2:hide 0, //nodraw 0:draw 1:no draw 0; //unicode 0:ansi 2:unicode endmacro; // 編集中のファイルのあるフォルダが、次のどのバージョン管理システムの管理下にあるか調べる // * GIT // * Mercurial // * Subversion // * その他(VCSの管理下にない場合も含む) // // Return: string VCSを表す文字列、または 空文字列。次のいずれか ("git", "hg", "svn", "") DETECT_VCS_KIND: $$dir = directory2; $$vcs[0] = "git"; $$vcs[1] = "hg"; $$vcs[2] = "svn"; while ($$dir != "") { ##i = 0; while (##i < 3) { if (existfile($$dir + "\\." + $$vcs[##i], 1) & 0x00000010) { return $$vcs[##i]; } ##i = ##i + 1; } call PARENT_DIRECTORY, $$dir; $$dir = $$return; } return ""; // 親ディレクトリのパスを返す // Param: string パス // Return: string 親ディレクトリのパス // 親ディレクトリが存在しない場合は空文字列 PARENT_DIRECTORY: ##i = strrstr($$1, "\\"); if (0 < ##i) return leftstr($$1, ##i); return "";