last updated:2021/08/02

Hidemaru Q and A

第III部〜秀丸マクロのいろはにほへと
 マクロ登録数の制限突破大作戦


マクロ登録数の制限突破大作戦

秀丸エディタのマクロが充実していることは定評になっていますが、マクロの登録数は80個まで、そのうちキー割り当ても出来るのは50個までという制限があります。(Ver.4.10β9 より制限がなくなり、80個すべて割り当て可能)
マクロを使いはじめのころにはそれだけあれば充分と感じますが、マクロ利用に慣れてきて使い込んでくると、上記の制限数が意外と「壁」になってきたりするものです。

ここでは、秀丸マクロ登録数の壁を破る方法を紹介します。
【1】では、マウスクリックで秀丸マクロを実行できる外部アプリケーションを、ごくごく簡単に(^^;)紹介します。
【2】では、秀丸マクロ自身を使って、秀丸マクロのキー割り当ての制限数を突破する方法を紹介します。

【1】マウスクリックで秀丸マクロを実行できるアプリケーションの紹介

秀丸エディタのマクロをマウスで実行するには、もちろん「マクロ(M)」メニューから実行できますが、画面上に常時表示させておいて1クリックで実行しようとすると、秀丸エディタ画面下部に出るファンクションキーへ登録することになります。

しかし、ファンクションキーに登録して画面上に常時表示しておけるマクロは、最大で12個です。もちろん[SHIFT], [CTRL], [ALT]キーを組み合わせると登録数自体は増やすことができますが、その数だけ画面上のボタンに表示できるというわけではありません。

それでは足りないという方のために、「マクロランチャー for秀丸エディタ」という外部アプリケーションが作成されています。これを使えば、1つ起動する毎に最大30個のマクロをボタンに登録して、Windows画面上に表示させておくことができます。
#16bit版秀丸エディタには使用できません。

「マクロランチャー for 秀丸エディタ」の入手先:

【2】「エッ! 秀丸エディタってマクロが80個しか登録できないのっ!?」〜マクロ登録数の制限を克服するマクロ〜

秀丸エディタを使っていて、マクロの便利さに気づくと、気に入ったマクロをどんどん登録してしまいがちです。そこで「ハタ」と気が付きます。マクロ登録ダイアログボックスには80個しか登録場所がない悲劇的な事実に。「ま、ま、まさかね。80個でおしまいなんて。ウソでしょ。だって秀丸エディタの紹介記事を見ると、マクロがスゴイ、マクロが便利だ、って書いてあるじゃん。それなのに、今さらマクロがたった80個だけしか使えないなんて…。なんとかしてケローーー」。

仕様上の制限

冷静になってもう一度、秀丸エディタの「マクロ登録」ダイアログを見ると、80個しか登録場所がありませんよね。秀丸エディタのヘルプには「秀丸エディタのマクロは、80個まで登録できますが、キー割り当て可能なのは1番から50番までの50個だけです。」と記載されています。(Ver.4.10β9 より制限がなくなり、80個すべて割り当て可能)
これを素直に読んだ人の多くは「ぐっぎゃ〜。なんじゃ〜。秀丸エディタってマクロが優れていると聞いてたけど、やっぱり噂通り、登録して実行できるマクロは80個しかないんだあ。うげっ」、「しかもエディタ利用者に多い、キーボードから素早い操作でのマクロ実行できるのはわずか50個だって…。これってなんだかなぁ〜」というため息混じりの声をもらすことでしょう。
でも、ご安心を。マクロの問題はマクロで解決する。しかも「どぅ〜いっと、ゆあせるふ」の精神で、ユーザ自身がこれを克服できる手段を思いつき得るのです。これがまあ、秀丸エディタの困ったところもあり、面白いところでもあるんですね。

制限克服の第一歩

このマクロ登録数の限界を克服するためのもっとも簡単な方法は、menu文を使ってメニューを表示させ、その選択結果から呼び出したいマクロをexecmacro文を用いて実行させる方法です。

例1:次のmenu00.macでは、30個のメニューが出て、30個のマクロを呼び出せます。

menu "実行マクロ01",
"実行マクロ02",
"実行マクロ03",
…
"実行マクロ30";
if(result==1)execmacro "macro01.mac";
else if(result==2)execmacro "macro02.mac";
else if(result==3)execmacro "macro03.mac";
…
else if(result==30)execmacro "macro30.mac";

制限克服への第二歩

メニューから呼び出したマクロで、さらに別のメニューを呼び出すようにすれば、簡単に80個以上のマクロを呼び出せます。

例2:macro01.mac

例えば、上記の例1で呼び出されるmacro01.macを次のように書くと、menu00.macで30個のメニューが表示された後、さらに新しく10個のメニューが表示されます。

menu "二次実行マクロ11",
"二次実行マクロ12",
"二次実行マクロ13",
…
"二次実行マクロ09";
if(result==1)execmacro "macro11.mac";
else if(result==2)execmacro "macro12.mac";
else if(result==3)execmacro "macro13.mac";
…
else if(result==9)execmacro "macro19.mac";

こうしたメニューを作っていけば、簡単に無数のマクロを『メニュー表示』を行ってその選択に従って実行できます。

アクセスキーでキーボードから快適操作

メニューを表示させると、その内容がわかりやすい反面、どうしてもうざったくなります。特にエディタは軽快さこそがイノチ。エディタを常用している人の中には、いちいち表示されるメニューが苦痛だと嘆く人が多いようです。しかもメニューを選択する際、いちいちマウスに手を伸ばし、数多くのメニューから希望する項目をクリックする作業は、文書入力の大きな妨げともなります。

そこで、キーボードから簡単にメニューを選択する方法を紹介しましょう。「メニューにアクセスキーを設定する」方法です。キーボードから入力した1文字の前に&を付けるだけです。メニューを表示させながら、マウスを使わないでキーボードからのみの指定ができるようになります。

例3:menu00.macで、下記のように「&」に続けて、希望する1文字を指定します。下記の例では、メニュー表示後「1」「2」「a」キーを押すだけで、それぞれのマクロが実行されます。

menu "実行マクロ01(&1)",
"実行マクロ02(&2)",
"実行マクロ03(&a)",
…
"実行マクロ30";
if(result==1)execmacro "macro01.mac";
else if(result==2)execmacro "macro02.mac";
else if(result==3)execmacro "macro03.mac";
…
else if(result==30)execmacro "macro30.mac";

メニューを出さないでマクロを実行したい

メニューからマクロを実行する方法以外に、80個以上のマクロを実行できないのでしょうか?
例えば、デフォルトでは「[Ctrl]+[F]」で検索ダイアログがでますよね。こうした使い方でマクロを実行させたいわけです。そして、これこそがこのセクションの最大のポイントです。
そこで改めてマクロ登録数に関する仕様内容を読み返してみましょう。「80個まで登録できます」です。おおっ。「80個までのマクロを実行できます」ではなかったんですね。つまり「登録の制限」があるだけで「80個しかマクロを実行できないわけではない」のです。この仕様の隙間に注目すれば、無限のマクロ登録が実現します!

登録数の制限突破への原理

あうん? 「登録の制限」があるだけで…、んで、「実行できないわけではない」…。なんだか、わかったようでわからないような…。これじゃ、まるで怪しげな結婚詐欺師。持って回った言い回しになってスイマセンです。要は「登録できるマクロは80個までだが、80個のマクロしか実行できないわけではない」という事です。

最大のポイントは「登録できるマクロ数には80という制限があるが、キー割り当てには制限がない」という仕様に注目するところです。実際のマクロ作成では、次のようなステップで目的を実現します。

  1. 複数のキー割り当てから1つのマクロを呼び出す
    「キー割り当て」によって指定できるマクロは、登録されたマクロに限られます。逆に言えば、複数の「キー割り当て」に対して、1つのマクロを重複して指定することは許容されているわけです。例えば、[Ctrl]+[A][Ctrl]+[Shift]+[A][Alt]+[A]の3つのキー割り当てに対して、すべてaaa.macというマクロを重複して指定します。

  2. 押されているキーの状態を判別する
    でも、1.まででは複数のキー入力によって1つのマクロの実行しかできません。そこで、呼び出されたマクロ(この例ではaaa.mac)では、押されているキーの状態を読みとります。 Ctrlキーは押されているのか、Shiftキーはどうか、アルファベットキーはどうなのか、などをiskeydown関数を用いて調べます。

    例えば、ここでは、[Ctrl]+[A][Ctrl]+[Shift]+[A][Alt]+[A]のキー状態を判別します。

  3. キーの状態に応じたマクロを呼び出して実行させる
    2.で得られたキーの状態に応じたマクロを呼び出せば、キーボードからさまざまなマクロを実行できます。(もっともこの場合、どのキーにどんなマクロを割り当てたかを覚えておく必要があります)。

具体的なマクロ作例

秀丸エディタでマクロ登録数の制限を克服するための原理の説明は以上でおしまいです。実際にどのようなマクロをこれを実現するか、2つの例を紹介することにします。

作例1

では、まず、上述の原理をもっとも忠実に再現したシンプルなマクロを紹介しましょう。(月刊アスキー97年3月号「パソコン早わかり研究会」より引用)

●マクロ登録数の限界を破る

Q.
秀丸エディタのマクロをショートカットキーやメニューに登録して使っています。でも登録は、最高で80個までしかできませんよね。しかし、雑誌の付録などで集めた小さいマクロも含めていろいろ登録していると、これではとても収まらなくなってきました。あふれたマクロを「マクロの実行」メニューから呼び出す方式はわずらわしいのでイヤなのですが、なんとかなりませんか。

A.

では、この制限を回避し、無制限にショートカットキーにマクロを割り当てるマクロを紹介します。「キー割り当ては50個で十分」という方も、備えあれば憂いなし、将来の不安を取り除くためにも1度お試しください。

手順は以下の通りです。ここでは例として、マクロ「ASCII.mac」をAlt+Ctrl+Shift+A(Alt/Ctrl/Shiftキーを同時に押しながらAキーを押す)に割り付けたい場合を想定します。また、便宜上、Alt/Ctrl/Shiftを特殊キー、A〜Zと0〜9を一般キーと呼ぶことにします。

  1. マクロ登録

    まず、以下の「moreMac.mac」を作成して、50番未満のマクロ登録位置に登録します。例として、「マクロ:1」の位置に登録名を「マクロ登録数の拡大」として登録してみます。

    // moreMac.mac(マクロ登録数の拡大)
    #c = 37;
    while( #c <= 90 ){
        if( iskeydown( #c ) )break;
        else #c = #c + 1;
    }
    if(iskeydown(16))#p = #p + 1;//Shift
    if(iskeydown(17))#p = #p + 2;//Ctrl
    if(iskeydown(18))#p = #p + 4;//Alt
    if(#p == 7){// [Alt + Ctrl + Shift]
    }else if(#p == 6){// [Alt + Ctrl]
    }else if(#p == 5){// [Shift + Alt]
    }else if(#p == 4){// [Alt]
    }else if(#p == 3){// [Shift + Ctrl]
    }else if(#p == 2){// [Ctrl]
    }
    endmacroall;

    画面H4 掲載したマクロ「moreMac.mac」を、「マクロ→マクロ登録」で「マクロ:1」に登録してみたところ。

  2. キー割り当て

    実行させたいキーの割り当てを行ないます。「その他→キー割り当て」ダイアログボックスで、「Alt」「Ctrl」「Shift」にチェックを入れ、「キー」の欄で「Alt+Ctrl+Shift+A」を選択します。次に「コマンド」の欄で「メニュー/マクロ」を選び、先ほど登録した「マクロ:1マクロ登録数の拡大」を選択します。

    画面H5 「その他→キー割り当て」で、「Alt+Ctrl+Shift+A」に先のマクロ「moreMac.mac」を割り当てた。

    画面H6 さらにマクロを追加したくなった時点で特殊キーと一般キーの組み合わせで、「コマンド」の欄が「(なし)」になっているところに、先の「moreMac.mac」を割り当てていくことになる。

  3. 実行させたいマクロの導入

    動かしたいマクロ(ASCII.mac)をマクロファイル用のフォルダにコピーします。もちろん、あらかじめ登録済みのマクロを利用する場合は、この作業は不要です。

  4. moreMac.macの書き換え

    先のmoreMac.macを開き、次の作業を行ないます。

    (ア)特殊キー状態に対応したブロックへの挿入

    マクロを割り当てたキーの特殊キーの状態に対応するmoreMac.macのブロック部分に存在する、次の1行を挿入してください。

    if(#c == XX )execmacro "NNNN.mac";

    たとえば先の例では特殊キーは「Alt+Ctrl+Shift」を押すことになっていましたから、moreMac.mac内の

    if(#p == 7){// [Alt + Ctrl + Shift]

    の後に挿入します。

    (イ)キーコードの指定(#c == XXの部分)

    そこで、特殊キーと組み合わせて押す一般キー(A〜Z、0〜9)を、そのキーコードに変更します。キーコードについては、表1の主なコード表を参照してください。例では「A」キーですから、「#c == XX」の部分を「#c == 65」と書き換えます。

    表1 主なキーコード一覧(10進数表記)
    キー キーコード
    Shift 16
    Ctrl 17
    Alt 18
    37
    38
    39
    40
    0〜9 48〜57
    A〜Z 65〜90

    (ウ)実行させるマクロファイルの指定(execmacro"NNNN.mac"の部分)

    [Alt+Ctrl+Shift+A]で実行させたいマクロの名前を指定します。例では「ASCII.mac」ですから、

    if(#c == 65)execmacro "ASCII.mac";

    画面H7 [Alt+Ctrl+Shift+A]で実行させたいマクロの名前を「ASCII.mac」と指定した。

  5. 登録したマクロの実行

    これで、[Alt+Ctrl+Shift+A]キーにより「ASCII.mac」が実行されます。 [Alt+Ctrl+Shift+A]が押された時点で実際にはmoreMac.macが起動し、そのマクロから、同じキー操作に割り当てられている「ASCII.mac」が実行されるわけです。

  6. 続々とマクロを登録していこう

    今後は、マクロを新規にキー割り当てしたくなった時点で、(2)〜(4)の処理を繰り返せば、あらゆる「特殊キー+一般キー」に対して事実上無制限にマクロを登録できます。あらかじめ、現在マクロが登録されていない特殊キーと一般キーの組み合わせに対して片っ端から「moreMac.mac」を割り付けておくと、今は面倒でも、後々はmoreMac.macのスクリプト変更だけでキー割付が実現するので楽でしょう(ただし、単独のShiftキーと一般キーとの組み合わせに割り付けることは避けましょう。文字入力が不便になります)。

    画面H8 moreMac.macに、実際にいくつかのマクロを割り当てた。登録マクロ数が増えると、このmoreMac.macはどんどん長いマクロになっていく。ちなみに、(4)-(ア)で指定する

    if(#c == XX )execmacro "NNNN.mac";

    は、「XX」の値さえ違えばいくらでも並べて書いていける(念のため)。

作例2

作例1のマクロでは、マクロファイルそのものを編集しなければいけません。これは秀丸マクロに慣れていないユーザにとっては難儀ですし、マクロが動作しなくなるなどの危険性も伴います。そこで、原理的には同じですが、さらに高度でぐっとハイセンスなマクロにしあげた例をご紹介します。安全でユーザビリティに優れています。(秀丸マクロ集REDライク Ver1.11に同梱。編集上の都合により一部変更)

●KEY_ASIN.MAC

KEY_ASIN.MACと初期値ファイル(HIDERED.INI)です。
初期値ファイルは、秀丸エディタフォルダ下のREDというフォルダにあるという前提になっています。


//TAB4
//--------------------------------------------------------------------------//
//  マクロ名  :  KEY_ASIN.MAC                                               //
//                                                                          //
//  機能概要 :  キー割り当てにマクロ数の制限をなくす                        //
//                                                                          //
//  注意事項 :  1. hidered.iniファイルの以下の内容を使用                    //
//                 セクション名[Key_Asin],キー名[押下キー]                  //
//                 書式 押下キー=マクロファイル名                           //
//                 「押下キー」は、キー割り当てのキーリストに表示されるもの //
//                 と同一                                                   //
//                                                                          //
//  使 用 例 :  1. hidered.iniファイルに以下の内容を定義                    //
//                 [Key_Asin]                                               //
//                 Alt+A=LTOPCHAR.MAC                                       //
//              2. [Alt]+[A]に、このマクロ「KEY_ASIN.MAC」を割り当て        //
//              3. [Alt]+[A]押下で、「LTOPCHAR.MAC」が実行                  //
//                                                                          //
//  作 成 者 :  高田                1997年10月25日                          //
//                                                                          //
//  修正履歴 :                                                              //
// 修正日   修正者          修正概要                                        //
// ------------------------------------------------------------------------ //
// XX/XX/XX XXXXXXXX        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //
// 01/03/11 高田            「_」,「<」,「>」の制限をなくした               //
//--------------------------------------------------------------------------//

//----------------------//
//      処理開始        //
//----------------------//

    //--------------------------------------//
    //      Alt,Shift,Ctrl押下チェック      //
    //--------------------------------------//
    #Alt = 0;
    if( iskeydown( 0x12 ) )
    { //---- Alt ----//
        #Alt = 1;
    }
    #Shift = 0;
    if( iskeydown( 0x10 ) )
    { //---- Shift ----//
        #Shift = 1;
    }
    #Ctrl = 0;
    if( iskeydown( 0x11 ) )
    { //---- Ctrl ----//
        #Ctrl = 1;
    }

    //----------------------------------//
    //      通常キー押下チェック        //
    //----------------------------------//
    #iflg = 0;

    //---- ファンクションキー ----//
    #i = 0;
    while( #i < 12 )
    {
        if( iskeydown( 0x70 + #i ) )
        {
            $key = "F" + str( #i + 1 );
            #iflg = 1;
            goto L1000;
        }
        #i = #i + 1;
    }

    #tbl[0]  = 0x24;    $tbl[0]  = "Home";
    #tbl[1]  = 0x23;    $tbl[1]  = "End";
    #tbl[2]  = 0x08;    $tbl[2]  = "Bksp";
    #tbl[3]  = 0x0D;    $tbl[3]  = "Return";
    #tbl[4]  = 0x2D;    $tbl[4]  = "Ins";
    #tbl[5]  = 0x2E;    $tbl[5]  = "Del";
    #tbl[6]  = 0x26;    $tbl[6]  = "Up";
    #tbl[7]  = 0x28;    $tbl[7]  = "Down";
    #tbl[8]  = 0x27;    $tbl[8]  = "Right";
    #tbl[9]  = 0x25;    $tbl[9]  = "Left";
    #tbl[10] = 0xC0;    $tbl[10] = "@";

    #i = 0;
    while( #i < 11 )
    {
        if( iskeydown( #tbl[#i] ) )
        {
            $key = $tbl[#i];
            #iflg = 1;
            goto L1000;
        }
        #i = #i + 1;
    }

    //---- アルファベットキー ----//
    #i = 0;
    while( #i < 26 )
    {
        if( iskeydown( 0x41 + #i ) )
        {
            $key = char( 0x41 + #i );
            #iflg = 1;
            goto L1000;
        }
        #i = #i + 1;
    }

    #tbl[0]  = 0xDB;    $tbl[0]  = "[";
    #tbl[1]  = 0xDC;    $tbl[1]  = "\\";
    #tbl[2]  = 0xDD;    $tbl[2]  = "]";
    #tbl[3]  = 0xDE;    $tbl[3]  = "^";
    #tbl[4]  = 0xE2;    $tbl[4]  = "_";
    #tbl[5]  = 0xBC;    $tbl[5]  = "<";
    #tbl[6]  = 0xBE;    $tbl[6]  = ">";

    #i = 0;
    while( #i < 7 )
    {
        if( iskeydown( #tbl[#i] ) )
        {
            $key = $tbl[#i];
            #iflg = 1;
            goto L1000;
        }
        #i = #i + 1;
    }

    //----------------------//
    //      マクロ実行      //
    //----------------------//
L1000:
    if( #iflg == 1 )
    { //---- キー押下あり ----//
        $key_asin = "";
        if( #Alt == 1 )
        {
            $key_asin = $key_asin + "Alt+";
        }
        if( #Shift == 1 )
        {
            $key_asin = $key_asin + "Shift+";
        }
        if( #Ctrl == 1 )
        {
            $key_asin = $key_asin + "Ctrl+";
        }
        $key_asin = $key_asin + $key;
        $mac = getinistr( hidemarudir + "\\red\\hidered.ini", "Key_Asin", $key_asin );
        if( $mac == "" )
        {
            message "「hidered.ini」の「[Key_Asin]セクション」の「[" + $key_asin + "]キー」に「マクロファイル名」を登録して下さい";
        }
        else
        {
            execmacro $mac;
        }
    }

    endmacro;
//---------------------- マクロここまで --------------------


;------------------ 初期値ファイルここから ----------------
[Key_Asin]
Ctrl+@=METAKEY.MAC
Shift+Return=SHELLEXE.MAC
Ctrl+L=SRCHGET.MAC
Ctrl+\=CUT2SRCH.MAC
Shift+Ctrl+L=TB_CLEAR.MAC
Ctrl+^=SRCH2CUT.MAC
Ctrl+[=ERRPASTE.MAC
Ctrl+O=TABDSP.MAC
Shift+Ctrl+S=FNM2SRCH.MAC
Ctrl+U=SRCHCHG.MAC
Ctrl+Y=DEL_LINE.MAC
Ctrl+Ins=INS_DL.MAC
End=WSIZECHG.MAC
Shift+Ctrl+@=METAKEY2.MAC
Ctrl+P=SRCHUP.MAC
Ctrl+N=SRCHDN.MAC
Shift+Ctrl+A=LTOPCHAR.MAC
Shift+Ctrl+I=LE_JUST.MAC
Shift+Ctrl+[=KEY_UNDO.MAC
;------------------ 初期値ファイルここまで ----------------

目次に戻る