第7章 マクロ組み込み事情

7-1 環境変数VZDEF

 VZ起動時に読み込むデフォルトのDEFファイル名をAUTOEXEDC.BATで指定します。

 [ESC]^外部マクロの実行」を実行すると、ファイラーが起動して、このディレクトリにあるマクロファイルの一覧を出します。「.def」の拡張子がつくファイルはここに置いてください。moremacexmacoutlawのような外部マクロローダもこのディレクトリを参照します。

SET VZDEF=C:\VZ\VZ.DEF

 「.DEF」は省略できます。

 プログラム本体とDEFの名前が同じ場合(たとえばVZJ31.COMVZJ31.DEF)には、

SET VZDEF=C:\VZ\

 のようにディレクトリ名だけでOKです。

 MI.DEFをお使いなら、次のように書きます。

SET VZDEF=C:\VZ\MI

 この環境変数を定義していない場合は、VZ.COMと同じディレクトリを参照します。

 なお、MS-DOS 2.11では、カレントディレクトリの「VZ.DEF」に固定されています。

7-2 カスタマイズエラー

 カスタマイズエラーには大きく分けて2つの症状があります。

  1. 外部マクロ実行時のエラー

    症状 [ESC]^外部マクロの実行」や^K^再カスタマイズ」を実行したら、マクロの読み込みが中断して、マクロファイルのエラー位置にカーソルが移動する。

  2. 起動時のエラー

    症状 DEFファイルを書き換えて再起動したら、ウィンドウの枠やファンクションキーなどが正常に表示されない。起動時にマクロファイルのエラー行が表示されることもある。

プリフィックスキーの間違い

症状 カーソルがキーアサインのあたりに移動する。

======== idea.def by I.KAMIMURA ========
* M
80 ^ID  "Idea Processor"
        ?.
〜〜〜〜(マクロ本体)〜〜〜〜〜
*
======== End of idea.def ========

 VZ.DEFでプリフィックスキー「^I」を指定していないのではありませんか。

【対策】

  1. 2ストロークキー(プリフィックスキー)に「^I」を書き加えてください。
    (変更前)
    ======== vz.def (v1.5) ========
    
    * C コマンドキー
    
    00      ^Q ^K    [ESC]  ;2ストロークキー(最大6個)
    01      ^[              :直前のコマンド実行
    02      ^_              :キーボードマクロ
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    
    (変更後)
    ======== vz.def (v1.5) ========
    
    * C コマンドキー
    
    00      ^Q ^K ^I [ESC]  ;2ストロークキー(最大6個)
    01      ^[              :直前のコマンド実行
    02      ^_              :キーボードマクロ
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    
  2. ^I」が単独で使われていたら、削除してください。
    (変更前:VZ.DEF -27)
    21      ^I   [TAB]      :タブ
    
    (変更後:VZ.DEF -27)
    21           [TAB]      :タブ
    

グローバルマクロとローカルマクロを書き間違えた

症状 カーソルはマクロ本体の先頭あたりに移動している。

 グローバルマクロのタイトルを書き忘れていませんか。

======== idea.def by I.KAMIMURA ========
* M
80 ^ID  ?.
        (マクロ本体)
*
======== End of idea.def ========

 マクロ番号をローカルマクロのように「:」付きで記述していませんか。

======== idea.def by I.KAMIMURA ========
* M

80: ^ID "Idea Processor"
        ?.
        (マクロ本体)
*
======== End of idea.def ========

メニューアイテム数の間違い

症状 カーソルがメニューアイテムのあたりに移動する

 アイテム数のパラメータは実際のアイテム数と一致していますか。

======== idea.def by I.KAMIMURA ========
* M
80 ^I   "Idea Processor"
        ?.
        (マクロ本体)
* P
1       "",8,1
        "A あいである"
        "B こうである"

*
======== End of idea.def ========

「*」のみの行をVZ.DEFにコピーした

症状 VZはいちおう起動するが、ウィンドウの枠やファンクションキーなどが正常に表示されない。

 VZ.DEF内にマクロをコピーしたとき、「*」のみの行もコピーしていませんか。VZはそこで読み込みを終了します。

13 ^Q] "表示行末"
        ?. &x(we-2) #?

80 ^Q\  "40column"
        ?.
        x=(lx/40+1)*40,                 ; 40の倍数にする
        (x>254)? x=254,                 ; 254 以内に限る
        &x(x) #?

*

14 [CLR]  "表示位置変更"
        ?. y=wy-1,y/=2,
        (ly==y)?{ ky=wy-2, >A }
        (ly==1)?{ ky=y, >A }
        ky=1,
:A      &d #]

VZ.DEFの肥満

症状 VZはいちおう起動するが、ウィンドウの枠やファンクションキーなどが正常に表示されない。

 VZ.DEFのファイルサイズが過大になっていませんか。VZは起動時にDEFを丸ごと読み込んで、それから余分なコメントや改行・スペースを取り除きます。VZ.COM本体との合計サイズが64キロバイトを越えると、異常が発生します。コメント類はできるだけ削除しておいてください。

7-3 メモリ関係のエラー

「メモリが足りません」

症状1 起動時に「メモリが足りません」とメッセージが出て、コマンドラインに戻ってしまう。

 ヒストリーバッファ関連(Hs,Hf,Hx,Ha,Bc,Bu)やマクロバッファのフリーエリア(Bm)の値を変更しませんでしたか。VZ.COM本体との合計サイズが64キロバイトに納まらないような過大な値を設定すると、起動できません。

 とりあえず、
C:\VZ>vz -bm0 でVZを起動して、VZ.DEFの設定を書き直してください。

症状2 outlawなど外部マクロローダでマクロを実行しようとしたが、ウンともスンとも言わない。

 パソコン通信のログなど巨大なファイルをたくさんオープンしていませんか。オープン可能なテキスト数に余裕があっても、それ以上ファイルをオープンできないことがあります。外部マクロローダは画面出力を一時的に停止するのでわかりませんが、実際には「メモリが足りません」とメッセージが出ているはずです。不要なファイルをクローズして、もう一度試してください。

「バッファがいっぱいです」

症状 [ESC]^外部マクロの実行」や^K^再カスタマイズ」を実行すると、マクロの読み込みが中断する。カーソルがマクロの途中に移動するが、そのあたりに書式のエラーはない。

 マクロバッファのフリーエリア(Bm)が不足しており、カーソル位置までしか読み込むことができません。Bmの値を大きくしてVZを再起動してください。ただし、過大な値を設定すると、今度は「メモリが足りません」攻撃に見舞われるので、気をつけてください。

「ラインバッファがいっぱいです」

症状 [ESC]^外部マクロの実行」や^K^再カスタマイズ」を実行すると、マクロの読み込みが中断する。カーソルがマクロの途中に移動するが、そのあたりに書式のエラーはない。

 VZはマクロを読み込むとき、マクロコードをいったんラインバッファ(Bl)に転送します。1つのマクロのサイズ(マクロ番号からマクロ番号まで)がラインバッファより大きくなると転送できません。Blの値を大きくしてVZを再起動してください。BlVZ.COMやマクロバッファとは別のセグメントに確保されるので、あまり神経質にならずに拡張できます。

 逆に言うと、マクロ作者は1つのマクロがBlの初期値(1024バイト)をオーバーしないように、ローカルマクロ化を心がけるべきでしょう。

7-4 キーアサインの重複

マクロのキーアサインが重複

 マクロのキーアサインが重複している場合には、マクロバッファの先頭に近いほうが実行されます。

コマンドのキーアサインが重複

 VZ.DEFでは、もともとコマンドのキーアサインが重複しています。

09      ^A  \[<--]      :1語←
88          \[<--]      :選択←                 ; Filer

 この場合、編集モードでは「1語←」が実行され、ファイラーでは「選択←」が実行されます。

マクロのキーアサインと編集モード以外のキーアサインが重複

80 [CLR]  "表示位置変更"

        (s==3)? { dd="futi", >87 }      ; ファイラーなら futi.def を起動
        y=(wy-1)/2,
        (ly==wy-2)?{ ky=y, >A }
        (ly==1)?{ ky=wy-2, >A }
        ky=1,
:A      &d #]

 このようなマクロがあっても、ファイラーモードでは「先頭/最後」(#92)が優先されます。マクロのほうを実行するには、「* C コマンド」のキーアサインを変更するか削除しなくてはなりません。

92      [CLR]           :先頭/最後             ;
    ↓削除
92                      :先頭/最後             ;

マクロバッファの構造

 マクロ番号、キーアサイン、マクロタイトル、ローカルマクロ、メニューは、マクロバッファに混在して格納されています。参考までに、マクロバッファの大まかな構造を紹介します。

【グローバルマクロ】
1バイトマクロ番号(1〜$7F)
2バイトマクロサイズ(nバイト)
2バイトキーアサイン(1バイト×2通り)
×バイトマクロタイトル(終端が0)
n-2-×バイトマクロ本体(終端が0)
【ローカルマクロ】
1バイトマクロ番号($81〜$E3:表記+$80)
2バイトマクロサイズ(nバイト)
nバイトマクロ本体(終端が0)
【メニュー】
1バイトメニュー番号($E1〜$FF:表記+$E0)
2バイトメニューサイズ(nバイト)
4バイトウィンドウのパラメータ
n-4バイトメニュー本体

※このデータはjunk.35氏に提供していただきました。

 グローバルマクロやローカルマクロの終端は、文字列と同じようにヌルコードで区切られています。マクロ番号でジャンプしたりコールしたりする際には、サイズ情報をもとに飛び石のようにジャンプするのでしょう。

 ポインタを駆使して、マクロ番号やキーアサインを書き換える荒技も可能です。残念ながら、マクロバッファの先頭を示すシステム変数がないので、先頭に向かって遡るのは困難です。

キーアサインテーブルの構造

 キーアサインは以下のような数値に変換されて格納されています。

[CTRL]+[英字](@,A-Z,[,\,],^,_)0〜$1F
[GRPH]+[英字]$20〜$3F
[n個目のプリフィックスキー]+[英字](n+1)*$20+<0〜$1F>
[特殊キー]$80〜$9F
[SHIFT]+[特殊キー]$A0〜$BE
[CTRL]+[特殊キー]$C0〜$DE
[GRPH]+[特殊キー]$E0〜$FE
未定義$FF

※このデータはjunk.35氏に提供していただきました。