秀丸マクロ: 文字列を置換する自作関数

他のプログラミング言語だと普通にある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」が自分自身(アクティブなファイル) を指定することができないからです。

秀丸マクロ