秀丸マクロでメニューを表示する方法

スポンサーリンク

秀丸マクロで下図のようなメニューを表示する方法を紹介します。

秀丸マクロ メニュー1

メニューを表示するには文字列を指定する方法や、 配列を指定する方法があるので順番に紹介します。 他にセパレーターやキー割り当ての方法も紹介します。

メニュー表示方法1: 文字列をカンマで区切る

以下は、メニューを表示する秀丸マクロのサンプルコードです。


// メニュー表示
menu "メニューA", "メニューB", "メニューC";

// message(str(result)); resultを表示

if (result == 1){
	// メニューA の処理
}else if (result == 2){
	// メニューB の処理
}else if (result == 3){
	// メニューC の処理
}else {
	endmacro;
}

秀丸マクロ メニュー1

「menu」文のあとに、 メニュー項目の文字列をカンマで区切ることでメニューを表示できます。

「result」は秀丸マクロのキーワードで、 「直前の処理の結果」を返します。
menuの場合は、何番目のメニューが選択されたかの値が返ってきます。 1番目のメニューが選択された場合の値は「1」です。 選択されずにエスケープキーを押した場合は「0」が返ってきます。

デバッグする時に、resultの値を確認したい場合は次のように記述します。

message(str(result));

メニュー項目が多い場合

メニュー項目が多い場合は、 横に長くなると見にくくなりますから、 カンマで改行すると可読性が高くなります。


menu "メニューA", 
	 "メニューB", 
	 "メニューC";

メニュー項目をキーボードから選択

メニュー項目をキーボードから選択できるようにするには、 文字列の末尾に「(&キー)」の形式で記述します。 例えば、「(&a)」の場合は「a」キーを押すと該当メニューが選択されます。


menu "メニューA(&a)", 
	 "メニューB(&b)", 
	 "メニューC(&c)";

下図ではメニューの文字列のあとにキーボードの割り当てが表示されています。

秀丸マクロ メニュー2

メニューにセパレーターを表示する

メニューにセパレーターを表示したい場合、 秀丸マクロでは「"\x01"」を指定します。

セパレーターもメニューの1つとみなされます。ですから セパレータを入れることで「result」の値が1つずれることに注意 してください。 下のサンプルコードの場合、「メニューC」は「result == 4」の場合となります。


menu "メニューA(&a)", 
	 "メニューB(&b)", 
	 "\x01",
	 "メニューC(&c)";

if (result == 1){
	// メニューA の処理
}else if (result == 2){
	// メニューB の処理
}else if (result == 4){
	// メニューC の処理
}else {
	endmacro;
}

下図ではメニューBとメニューCの間にセパレーターが表示されています。

秀丸マクロ メニュー セパレーター

メニュー表示方法2: 配列を指定する

文字列配列を指定してメニューを表示することもできます。 以下は秀丸マクロサンプルコードです。

// メニュー用配列
$arr[0] = "メニューA(&a)";
$arr[1] = "メニューB(&b)";
$arr[2] = "メニューC(&c)";

// メニュー表示
menuarray $arr, 3;

if (result == 1){
	// メニューA の処理
}else if (result == 2){
	// メニューB の処理
}else if (result == 3){
	// メニューC の処理
}else {
	endmacro;
}

配列を指定する場合は、menuarray文を使用します。 第一引数に文字列配列、第二引数にメニューの個数を指定。

配列を使用する場合に注意する点があります。
キーワード「result」の値と、配列のインデックスは一致しません。 例えば、「メニューA」を選択した場合、「result」の値は「1」ですが、 「メニューA」が格納されている配列$arr[]のインデックスは「0」です。

この点は秀丸マクロの特殊な部分なので注意してください。