最終更新日 2024-09-25

自動起動マクロのまとめ方

概要

ここでは、自動起動マクロのまとめ方のチップが記載されています。

自動起動マクロのまとめ方

秀丸マクロの自動起動マクロは、個々のイベントにマクロファイルを設定することも出来ますが、
自動起動マクロは、そのイベントハンドラの特性上、
異なるイベントで似たような内容のものになることが多くあります。

例えば、「ファイルを開いた時」「新規作成時」「アクティブ切り替え時」などは、
同じ処理が必要なのではないか?
と考えられます。

「ファイルを閉じた時」と「ファイルを保存した時」も同じ処理が必要かもしれません。

自動起動マクロはeventの番号で分け、ファイルは糾合する

そう考えた時、自動起動マクロは、以下のマクロのように、
「event番号」や「geteventparam」によるサブパラメータを利用し、
うまく切り分け、全体としてイベントハンドラ集のように作成することが想定されているようです。

OnEventMacros.mac
/*
 * 自動起動マクロの、まとめ方のサンプル
 */


//===========================================================
// イベント番号に対応するラベルへと飛ぶ。
//-----------------------------------------------------------
disablebreak;
$event_label = "OnEvent_" + sprintf("%02d", event);
call $event_label;
enablebreak;
endmacro;
//===========================================================


//===========================================================
// 自動起動マクロではない
//-----------------------------------------------------------
OnEvent_00:
	
	return;
//===========================================================

//===========================================================
// ファイルを開いた直後
//-----------------------------------------------------------
OnEvent_01:
	call OnPost_FileOpen;

	return;
//===========================================================

//===========================================================
// 新規作成直後
//-----------------------------------------------------------
OnEvent_02:
	call OnPost_NewDocumentMake;

	return;
//===========================================================

//===========================================================
// 保存直前と直後
//-----------------------------------------------------------
OnEvent_03:
	##is_after_save = geteventparam(0);
	if (##is_after_save) {
		call OnPost_FileSave;
	} else {
		call OnPrev_FileSave;
	}

	return;
//===========================================================

//===========================================================
// 印刷直前と直後
//-----------------------------------------------------------
OnEvent_04:
	
	return;
//===========================================================

//===========================================================
// 編集後タイマー
//-----------------------------------------------------------
OnEvent_05:
	
	return;
//===========================================================

//===========================================================
// カーソル移動後タイマー
//-----------------------------------------------------------
OnEvent_06:
	
	return;
//===========================================================

//===========================================================
// ファイルを閉じる直前
//-----------------------------------------------------------
OnEvent_07:
	call OnPrev_FileClose;
	
	return;
//===========================================================

//===========================================================
// 秀丸の対象ウィンドウがアクティブになった直後
//-----------------------------------------------------------
OnEvent_08:
	call OnPost_WindowFocus;

	return;
//===========================================================


//===========================================================


//-----------------------------------------------------------
// 各実装
//-----------------------------------------------------------

//-----------------------------------------------------------
OnPost_FileOpen:
	return;

//-----------------------------------------------------------
OnPost_NewDocumentMake:
	return;

//-----------------------------------------------------------
OnPost_WindowFocus:
	return;

//-----------------------------------------------------------
OnPrev_FileSave:
	return;

//-----------------------------------------------------------
OnPost_FileSave:

	/*
	 * .macファイルなら、utf8やutf16ならBOMを自動付与、sjisなら何もなし
	 * それ以外なら、マルチバイト文字がはいっていれば、警告メッセージをアウトプット枠へ
	 */
	if (filetype == ".mac") {

	    ##encode_num = encode & 0x3F;

	    // utf8? or utf16?
	    if (##encode_num==2 || ##encode_num==6) {
	        if (!bom) {
	            setencode encode, 1, 1;
	            save;

	            ##OUT = loaddll("HmOutputPane.dll");
	            #ret = dllfunc(##OUT, "Output",hidemaruhandle(0),"秀丸マクロと判断した場合、BOMが必要です。\r\n ⇒ BOMを付与しました。\r\n");
	            freedll(##OUT);

	        }
	    }

	    // sjis?
	    else if (##encode_num==1) {
	        ; // なし
	    }

	    // その他。
	    // ワザとでもない限り、日本人がマクロ保存時にここに突入してはこないだろう…
	    // 別言語圏の人が、その圏で主要なマルチバイト等で保存した、など?
	    else {
	        // 多バイト文字っぽいのが含まれているか?

	        // 文字数とバイト数が異なれば…といった趣旨
	        if (charcount(0x00000000|0x00000000|0x00000000|0x00000000|0x00200000) != 
	            charcount(0x00000001|0x00000000|0x00000100|0x00000000|0x00200000)) {

	            ##OUT = loaddll("HmOutputPane.dll");
	            #ret = dllfunc(##OUT, "Output",hidemaruhandle(0),
	                "秀丸マクロと判断した場合、不正な文字コードです。\r\n ⇒ sjis / utf8(bom) / unicode(bom) のいずれかで保存してください。\r\n"
	            );
	            freedll(##OUT);
	        }
	    }
	}

	return;


//-----------------------------------------------------------
OnPrev_FileClose:
	return;