第7章 マクロ組み込み事情
7-1 環境変数VZDEF
VZ起動時に読み込むデフォルトのDEFファイル名をAUTOEXEDC.BATで指定します。
[ESC]^「外部マクロの実行」を実行すると、ファイラーが起動して、このディレクトリにあるマクロファイルの一覧を出します。「.def」の拡張子がつくファイルはここに置いてください。moremac、exmac、outlawのような外部マクロローダもこのディレクトリを参照します。
SET VZDEF=C:\VZ\VZ.DEF
「.DEF」は省略できます。
プログラム本体とDEFの名前が同じ場合(たとえばVZJ31.COMとVZJ31.DEF)には、
SET VZDEF=C:\VZ\
のようにディレクトリ名だけでOKです。
MI.DEFをお使いなら、次のように書きます。
SET VZDEF=C:\VZ\MI
この環境変数を定義していない場合は、VZ.COMと同じディレクトリを参照します。
なお、MS-DOS 2.11では、カレントディレクトリの「VZ.DEF」に固定されています。
7-2 カスタマイズエラー
カスタマイズエラーには大きく分けて2つの症状があります。
- 外部マクロ実行時のエラー
[ESC]^「外部マクロの実行」や^K^「再カスタマイズ」を実行したら、マクロの読み込みが中断して、マクロファイルのエラー位置にカーソルが移動する。
- 起動時のエラー
DEFファイルを書き換えて再起動したら、ウィンドウの枠やファンクションキーなどが正常に表示されない。起動時にマクロファイルのエラー行が表示されることもある。
プリフィックスキーの間違い
【症状】カーソルがキーアサインのあたりに移動する。
======== idea.def by I.KAMIMURA ========
* M
80 ^ID "Idea Processor"
?.
~~~~(マクロ本体)~~~~~
*
======== End of idea.def ========
VZ.DEFでプリフィックスキー「^I」を指定していないのではありませんか。
【対策】
- 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 ^_ :キーボードマクロ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 「^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 -bm0
でVZを起動して、VZ.DEFの設定を書き直してください。
【症状2】 outlawなど外部マクロローダでマクロを実行しようとしたが、ウンともスンとも言わない。
パソコン通信のログなど巨大なファイルをたくさんオープンしていませんか。オープン可能なテキスト数に余裕があっても、それ以上ファイルをオープンできないことがあります。外部マクロローダは画面出力を一時的に停止するのでわかりませんが、実際には「メモリが足りません」とメッセージが出ているはずです。不要なファイルをクローズして、もう一度試してください。
「バッファがいっぱいです」
【症状】 [ESC]^「外部マクロの実行」や^K^「再カスタマイズ」を実行すると、マクロの読み込みが中断する。カーソルがマクロの途中に移動するが、そのあたりに書式のエラーはない。
マクロバッファのフリーエリア(Bm)が不足しており、カーソル位置までしか読み込むことができません。Bmの値を大きくしてVZを再起動してください。ただし、過大な値を設定すると、今度は「メモリが足りません
」攻撃に見舞われるので、気をつけてください。
「ラインバッファがいっぱいです」
【症状】 [ESC]^「外部マクロの実行」や^K^「再カスタマイズ」を実行すると、マクロの読み込みが中断する。カーソルがマクロの途中に移動するが、そのあたりに書式のエラーはない。
VZはマクロを読み込むとき、マクロコードをいったんラインバッファ(Bl)に転送します。1つのマクロのサイズ(マクロ番号からマクロ番号まで)がラインバッファより大きくなると転送できません。Blの値を大きくしてVZを再起動してください。BlはVZ.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氏に提供していただきました。