秀丸マクロ: 文字列を置換する自作関数
他のプログラミング言語だと普通にあるreplace関数が秀丸にはありません。
そこで自作しようと思ったら、ちょうどいいサンプルがあったので
こちらのサイトを参考にさせてもらいました。
流れはほぼ同じなのですが、 正規表現を使った置換ができるようにしたり、 誰でもアレンジしやすいように各行にコメントを入れています。
文字列を置換する自作関数
replace()関数代わりの自作関数(サブプロシージャ)です。
通常の置換と、正規表現での置換の両方に対応しています。
秀丸マクロ プログラム
コードは次の通りです。下で簡単な解説をしています。
// 使用例1 ----------------------
$str = "abcabcabc";
// "a" を "x" に置換
call s_replace, $str, "a", "x";
message $$return; // "xbcxbcxbc"
// 使用例2 -----------------------
$str = "<b>hello</b>";
// 正規表現を使って<b>タグを削除
call s_replace, $str, "<(/)?b>", "", "regular";
message $$return; // "hello";
endmacro;
//--------------------------------------
// 文字列置換用関数 s_replace
// 第1引数: 検索対象文字列
// 第2引数: 検索文字列
// 第3引数: 置換後文字列
// 第4引数: 正規表現を使う場合は「"regular"」を指定
// 戻り値 : 置換後の文字列
// -------------------------------------
s_replace:
// 引数を各変数に代入
$$str = $$1;
$$str_pre = $$2;
$$str_after = $$3;
$$reg = $$4;
// 実行中のウィンドウハンドルを取得(メインファイル)
##h_main = hidemaruhandle(0);
// 新規作成状態の見えない秀丸エディタが起動(ステルスファイル)
openfile "/h";
// 実行中のウィンドウハンドルを取得(ステルスファイル)
##h_sub = hidemaruhandle(0);
// insert
insert $$str;
// 置換
if ($$reg == "regular") {
// 正規表現
replaceallfast $$str_pre, $$str_after, regular;
} else {
// 通常
replaceallfast $$str_pre, $$str_after;
}
// すべてを選択
selectall;
// 選択範囲の文字列を取得(範囲選択を維持しない)
$$str_re = gettext(seltopx,seltopy,selendx,selendy);
// メインファイルをアクティブにする
setactivehidemaru ##h_main;
// ステルスファイルを閉じる
closehidemaruforced ##h_sub;
// 戻る
return $$str_re;
コード解説
プログラム流れとしては次の通りです。
- 新規の隠れファイル(ステルスファイル)を開く
- ステルスファイル上で「replaceallfast」を使って置換する
- 置換後の文字列を返す
「openfile "/h";」で新規のステルスファイルを使う所がポイントです。
後は、最後の方で次の記述があります。
// メインファイルをアクティブにする
setactivehidemaru ##h_main;
// ステルスファイルを閉じる
closehidemaruforced ##h_sub;
先にメインファイルをアクティブにしてから、 ステルスファイルを閉じないとうまくいきません。 これは「closehidemaruforced」が自分自身(アクティブなファイル) を指定することができないからです。