第6章 マクロユーティリティ

無法者は今夜も野宿の火を見つめながら呟く。
『ふっ。荒馬の心は、
荒くれ者がいちばんよく知っているのさ。
なあ。ブイゼット』
−荒野のマクロ師

付録FD: OUTLAW.DEF OUTLAW.DOC OUTLAW.153 SAMPLE.DOC

6-1 outlawのねらい

外部マクロをマクロキーで瞬時に組み込み・実行する

 [ESC]^「外部マクロの実行」では、まずファイラーが起動してマクロファイルの一覧が出ます。そこで目的のファイルにカーソルを移動してリターンで選択する、という手順を踏まなくてはなりません。outlawを使えば、割り当てたマクロキーで瞬時に組み込み・実行できます。外部マクロファイルの2番目以降に記述されたマクロも、直接実行することができます。

マクロバッファサイズの制限をとりはずす

 [ESC]^「外部マクロの実行」でいろいろなマクロを組み込んでいると、「バッファがいっぱいです」と警告のメッセージがでて、それ以上マクロを組み込めなくなることがあります。outlawを使えば、大きなマクロをいくつでも自在に組み替えて使うことができます。

編集モード以外でも外部マクロを組み込むことができる

 文字入力ウィンドウ・コマンドライン・ファイラーでも外部マクロを組み込み・実行できます。たとえば、【検索文字列】のウィンドウで、カーソル位置に日付を書き込むような外部マクロを実行できます。すでに文字列が入力されていた場合にも、その文字列やカーソル位置を忠実に再現して、日付を挿入します。

6-2 ここだけ読めば、あなたも無法者!?

下準備

  1. outlaw(800 バイト程度)をVZ.DEFの「* M マクロ」の先頭にコピーしてください。
  2. これからいろいろな外部マクロを使うのですから、「* O オプション」で、マクロバッファのフリーエリア(Bm)を拡張してください。さしあたって5倍ぐらいでよいでしょう。

ep+,[ESC]でエディタを終了)でVZを使っている人は、outlaw.orgの「★」の2行を削除してください。(outlaw.def に削除済みのものを同梱)

* M マクロ
87"fist"nn0,>>
88"outlaw 1.50"(cm-2)?{(dd-hh||nn-ll)??>*}(wc==tc)?{&m(8).}

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

* O オプション

Bt64                    ;テキストバッファのサイズ (16..64KB)

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

Bm1024*5                ;マクロバッファのフリーエリア

※ 「*5」で5倍になります。

外部マクロの登録方法

 たとえば、VZに添付されているtool.defの「指定桁折」マクロを呼び出すには、vz.defの「* M」に次のように記述してください。

35 ^KQ  "指定桁折"
        dd="tool",              ; 外部マクロファイル名「.def」は不要
        nn=71,                  ; 外部マクロファイル内でのマクロ番号
        >88                     ; outlaw へのジャンプ命令

 VZを再起動してください。^KQで一瞬にして【指定桁折(70)】という入力窓があらわれるはずです。ふつうに[ESC]^外部マクロの実行」だと、ファイラーでtool.defまでカーソルを移動してリターン。まず【ツールメニュー】があらわれて、そこから「指定桁折」マクロを選択するという手順を踏まなくてはなりませんが、outlawを使えば、外部マクロファイル内のどのマクロでもダイレクトに組み込み・実行できるのです。

厳重注意

 ほかのマクロではグローバル、 ローカルを問わず、マクロ番号「88」「89」「119」を使わないでください。

「88」outlaw自身のマクロ番号。
「89」「119」outlawがダミーのマクロ番号として使用。

 ただし、外部マクロファイルの先頭のマクロ番号は「89」になっていた方がむしろ好都合です。(詳しくは後述)

これで基本的な説明は終わりです。

 さっそく貴方の常用マクロをoutlawで組み込んで、無限にひろがるマクロの世界を堪能してください。

 以下、outlawを使いこなすための注意点、コツ、マクロに関する一般的な話など述べます。興味のある方は読み進めてください。

6-3 outlawを援護する小物マクロ

88 ^]   "whip"
        &b(3) cm=3,
        (ks&1)??.
        ep-,                            ; ★
        dd"!", nn-,                     ; 関連する変数を初期化
        cm=2, &88 cm-,                  ; シフト実行でマクロバッファをクリア
        &m("Bm:%d bytes free",bm)

88 [ESC]^ "wanted"                      ;「外部マクロの実行」
        dd"*", hh-, nn-, >88            ; 製品版の代用

88 ^\   "shane" >*                      ; 究極のマクロリピート

88 ^K^  "install"
        ?. hh-, #80

 これらの小物マクロでoutlawをより快適に使うことができます。小さなマクロなので、vz.def内に記述してください。(outlaw.defに同梱)

 マクロ番号がoutlaw本体と同じ「88」になっているのを不審に思われるかもしれませんが、outlaw本体の直後におく場合は支障ありません。

「88 ^] "whip"」……外部マクロファイルの点検・参照機能

 このマクロを実行した直後に、外部マクロ実行キーを押すと、その外部マクロファイルをオープンします。初期設定を書き換えるときなどに便利です。Read onlyモードでオープンするので、^KRで解除してから編集してください。

 このマクロはcm(直前のコマンド)に3(エスケープ)をいれています。outlawcm=3,の場合、外部マクロファイルをオープンした時点で処理を中断します。

「88 ^] "whip"」シフト実行……マクロバッファをクリア

 シフトキーを押しながら実行すると、マクロバッファに読み込まれた外部マクロ(マクロ番号89以降)をクリアして、「Bm:???? bytes free」とメッセージをだします。ついでに、ep-,にします。ふだんep+,で使っている人は、「ep-,」を削除してください。epオプションの働きについては、「モード型マクロ」の項であらためて説明します。

 このマクロはdd="!",という存在しないファイル名を与えています。outlawは通常、存在しないファイル名ではエラー処理をおこないますが、dd="!",に限っては新規作成してBmをクリアします。

 マクロバッファに活をいれる役割をもっていることから、「whip」()と名付けました。

「88 [ESC]^ "wanted"」……外部マクロの実行

 キーアサインからもわかるように、vz.def標準の「外部マクロの実行」を代用するマクロです。標準版のほうは削除してかまいません。単に代用するだけではなく、マクロ番号を「89」に変更して組み込むので、マクロバッファを不用意に破壊せずに済み、また、フリーエリアを効率よく利用できます。

 指名手配書(ファイラー)に居並ぶ無法者(外部マクロ)を射止めてください。えっ、outlawが無法者を射止めるのはおかしい? いいえ、outlawは賞金稼ぎなのです。

「^\ "Shane"」……究極のマクロリピート

 「>*」というマクロコードは、「最後に組み込んだマクロを実行」する命令です。outlawによる組み込みでも、「外部マクロの実行」による組み込みでも、このマクロで繰り返し実行できます。

 VZの基本機能「01 ^[(直前のコマンド実行)」でマクロ実行キーを再実行するという方法もありますが、カーソルを動かしだけで「直前のコマンド」は変わってしまいます。カーソルを移動しながら、同じ外部マクロを繰り返したい場合には、このマクロを使ってください。キーアサインは[CTRL]+[\]のように簡単なものでないと意味がありません。なぜならば、outlawは「再読み込み防止」機能をもっているので、本来のマクロ実行キーを連続して押しても、読み込みのタイムラグはないからです。

 また、公開マクロを試用するときに、手動で^K^「再カスタマイズ」を実行して、組み込むこともあるでしょう。もしそのマクロのキーアサインがすでにvz.defで使われていた場合には、実行キーを押してもvz.def内のマクロが実行されてしまいます。わざわざキーアサインを書き換えなくても、^\究極のマクロリピート」で実行できます。

 「Shane」とは「早撃ちの達人」ぐらいの意味です。由来は……。うーん。

「88 ^K^ "install"」……再カスタマイズ

 これはVZの基本機能^K^「再カスタマイズ」に、「hh-,」を加えただけです。outlawは最後に読み込んだ外部マクロファイル名をhhに保存しているので、outlaw以外の方法でマクロを組み込んだときにはhhを初期化しておかなくてはなりません。さもないと、outlawが記憶している「最後に組み込んだマクロ」と、実際の「最後に組み込んだマクロ」がくいちがって、奇妙な動作をすることがあります。

公開マクロのマクロ番号とキーアサイン

 公開マクロを無造作に^K^で組み込むと、そのマクロ番号によってはマクロバッファの一部を上書き消去してしまいます(「outlawの動作原理」参照)。未使用の番号に書き換えてから再カスタマイズしてください。たいていの外部マクロローダーがダミーに使っている「89」が、おすすめです。キーアサインも「^\」にしておけば、どっちみち「究極のマクロリピート」で実行できるのですから頭を悩まさなくても済みます。

6-4 outlawを使いこなす

シフト実行

 マクロ実行キーをシフトキーといっしょに押すことによって裏機能を実行するマクロでは、シフトキーを長めに押してください。outlawが外部マクロを読み込み・実行するまでに、わずかながら時間がかかります。ただし、直前に読み込んだ外部マクロを再実行する場合は、再読み込み防止機能が働くので、長めに押す必要はありません。^\究極のマクロリピート」もシフト実行できます。

モード型マクロを実行中に、新たにマクロを組み込んではいけません

 モード型マクロとは、^KJ文字コード表示」のようにカーソル位置の文字コードをメッセージに表示しつづけたり、keisen.defの「作表モード」のように特定のキー入力(^F ^A ^C ^Rなど)がふだんとちがう動作をするマクロのことを言います。

 この種のマクロをoutlawで呼び出した後に、正規の手順でモードを抜けないうちに、またoutlawでマクロを呼び出したりすると危険です。特定のモードを設定するようなマクロではたいてい、使用者が設定しているオプションを一時的にマクロスタックに退避させて、モードに都合のいいオプションに設定しなおし、モードを抜けるときに、使用者の設定に戻す操作をおこないます。

 したがって、モードを抜けないうちに、別のマクロを呼び出すと、オプションが元に戻りません。下手をするとハングアップします。特にモード型マクロではep+,(編集モードで[ESC]が有効になる)に変更して、[ESC]1打でモードを終了するものが多いので、ep+,のまま異常終了すると、そのあと2ストロークキーのつもりで[ESC]を押した瞬間にVZが終了してしまいます。([ESC]は本来、編集モードではVZの終了キーとして働きます)

 それを回避するために、outlawの初期設定では、ep+, の状態ではマクロを組み込まないようにしてあります。

 ましてやモード型マクロを多重実行しようものなら、どんな予想外の動作をするかわかりません。これはoutlawを利用する場合にかぎりません。^KJ文字コード表示」を多重実行してみればわかりますが、なんど[ESC]を押しても終了できなくなります。

 モード型マクロは現在実行中のものしか有効でないことも心得ておいてください。オートセーブマクロはモード型マクロですが、他のモード型マクロを多重実行しているあいだは無効になります。もし多重実行の相性が悪くてハングアップしたとしても、オートセーブはおこなわれていないので、元も子もなくなります。

外部マクロの登録方法(詳説)

 vz.defへの記述の仕方をもう少し詳しく解説してみましょう。

35 ^KQ  "指定桁折"

        dd="tool",              ; 外部マクロファイル名「.def」は不要
        nn=71,                  ; 外部マクロファイル内でのマクロ番号
        >88                     ; outlaw へのジャンプ命令

「35」… vz.def内のマクロ番号

 vz.def内で同じ番号を重複して使っても、マクロ実行キーで呼び出すぶんには、問題なく動作します。ただし【マクロメニュー】から選択すると、同じ番号の最初のものしか実行されません。

 ちなみに、公式にはマクロ番号は「89」までしか使用できないことになっていますが、実際には「127」まで使用できます。そういった不法な(?)番号のマクロを組み込んで、[ESC]M【マクロメニュー】を覗いてみると、「100」〜「109」なら「&:0」〜「&:9」と表示されているのがわかります。

「^KQ」……キー割り当て

 ほかのマクロと重複しないように気をつけてください。キー割り当てが重複すると、先に組み込まれたものしか実行されません。マクロ番号がちがえば、【マクロメニュー】から選択することも可能です。

 外部マクロファイル内でのキー割り当ては、省略してもいっこうに差し支えありません。outlawは単純に「nn=71,」で指定されたマクロ番号を検索して実行します。

「dd="tool",」…外部マクロ主ファイル名

 ディレクトリや拡張子「.def」はoutlawが自動的に付加します。

 二重引用符でくくり、最後にカンマを付けるのを忘れないでください。

「nn=71,」…外部マクロファイル内でのマクロ番号,

 vz.def内での番号と違ってもかまいません。

 「outlawの動作原理」で詳述しますが、外部マクロファイルをオープンして、マクロ番号を単純に検索しているので、vz.defで「nn=7,」、外部マクロファイルで「07 [ESC]U @U "U 編集のやり直し"」となっていると、検索できません。vz.defで「nn=07,」と記述しても効き目はありません。

 outlawの1箇所を書き換えれば、「07」も検索できますが、外部マクロの番号はたいてい2桁なので、実用上問題ないでしょう。

「>88」…… outlawへのジャンプ命令

 なにも考える必要はありません。ddnnの内容を指定して、「>88」とジャンプさせてやれば、あとはoutlawが全部自動的にやってくれます。指定した外部マクロが存在しないときには、警告のメッセージ「〜not found」を出します。

マクロ番号 0

 nn(マクロ番号)が0の場合には、無条件に外部マクロファイル内の最初のマクロを実行します。外部マクロはたいてい先頭にメニューをもっていて、そこから処理を選択することが多いので、「nn=0,」で済ませることが多くなるでしょう。「nn=70,」と書くよりは、1 bytesお得です。さらに、VZのマクロの仕様で「nn=0,」は、「nn0,」または「nn-,」と略記できます。

70 [ESC]H "【ツールメニュー】"
        dd="tool", nn0, >88

fist拳骨)マクロ

 「nn=0,」はおそらく頻繁に使われることになるので、もっと簡略化する方法を紹介します。outlawの前に、ひとつ小さなマクロ「87」を付け足すのです。

87      "fist" nn0, >>                  ; ここにジャンプすれば nn0, を省略可
88      "outlaw"                        ; キー割り当ては必要ありません
〜〜〜〜(マクロ本体)〜〜〜〜〜〜〜〜〜

outlaw.defに同梱

 outlawの「88」へジャンプする前に、「87」へジャンプして、「nn0,」を実行しておくのです。「>>」は、次のマクロへのジャンプ命令です。

 すると、以下のように簡略化できます。

70 [ESC]H "【ツールメニュー】"
        dd="tool", >87

 この簡略化も、累積するとvz.defのコンパクト化に貢献します。

 面倒なマクロ番号の指定はfist拳骨)で手っとり早く片づけてください。

外部マクロファイル名の指定を簡略化

 逆に、ひとつの外部マクロファイルにたくさんの小物マクロがある場合には、ファイル名の指定を簡略化できます。

 たとえば、block.defを普通に登録すると、次のようになります。

60 ^KB "矩形ブロックモード"
        ?. #b (mb)? { mb4, xb=lx, }

61 ^Y [F08] "矩形ブロック削除"
        dd"block", nn61, >88

62 ^KK \[F08] "矩形ブロック記憶"

        dd"block", nn62, >88

63 ^J [F09] "矩形ブロック挿入"
        dd"block", nn63, >88

65 [ESC]] "行末のSPACE・TABの削除"
        dd"block", nn65, >88

 同じファイル名を何度も記述するのはマクロバッファの無駄使いなので、次のように記述しましょう。

60 ^KB "矩形ブロックモード"
        ?. #b (mb)? { mb4, xb=lx, }

61 ^Y [F08] "矩形ブロック削除"
        nn61, >01

62 ^KK \[F08] "矩形ブロック記憶"

        nn62, >01

63 ^J [F09] "矩形ブロック挿入"
        nn63, >01

65 [ESC]] "行末のSPACE・TABの削除"
        nn65, >01

1:      dd"block", >88

 ローカルマクロ「1:」に注目してください。まずここにジャンプして、ファイル名の指定を共用するのです。一つのファイルに多くのマクロがある場合に効果があります。

マクロタイトルの省略

 マクロタイトルは省略してかまいません。これはoutlawを使わない人にとっても大いに有効です。

60 ^KB "" ?. #b (mb)? { mb4, xb=lx, }

61 ^Y [F08] "" nn61, >01

62 ^KK \[F08] "" nn62, >01

63 ^J [F09] "" nn63, >01

65 [ESC]] "" nn65, >01

1:      dd"kblock", >88

※ 二重引用符は残しておかないと、カスタマイズエラーになります。

 当然、[ESC]Mマクロメニュー」でタイトルは表示されなくなります。

 ただし、

70 [ESC]H ""
        dd"tool", >87

 のような場合には、「dd"tool」というマクロコードが表示されるので十分でしょう。

「?.」の省略

 たいていのマクロの先頭には「?.」と記述されています。これは「編集モード以外では実行を禁じる」という呪文です。前述のblock.defの例のように、outlawで組み込む場合にはvz.def内の「?.」は省略してかまいません。外部マクロ側の「?.」でちゃんとチェックされます。

6-5 outlawの荒技

 たくさん外部マクロを使うようになると、ファイルが増えてわずらわしくなります。クラスタサイズ以下の小物マクロごとにファイルを作っていたのでは、ディスク容量の浪費もばかになりません。outlawはディスク容量の節約、マクロバッファの節約をちゃんと考慮しています。

小物マクロを「*」で区切る

 小物マクロをひとつの外部マクロファイルに詰め込めば、ファイルが減って、クラスタも効率よく使うことができるでしょう。しかし、VZのマクロ組み込み(再カスタマイズ)は、指定されたマクロ番号から、「*」のみの行(マクロの終了宣言)までを一括して読み込むので、指定のマクロより後ろ側に記述された他のマクロも合計したサイズ分、マクロバッファを消費します。小物マクロの数が多い場合には、マクロバッファが不足して読み込みが中断し、本末転倒になるおそれさえあります。

 このままではoutlawの「マクロバッファサイズ(Bm)の制限をとりはずす」という歌い文句が泣きますので、裏技(?)を紹介しましょう。

 小物マクロのあいだを「*」のみの行で区切る

 簡単でしょう?

 outlawはVZの再カタマイズの制限を緩和しています。

 記述例を示します。

==== tool.def ====
* M マクロ
71 [ESC]Y "指定桁折"
        (マクロ本体)
*
72 [ESC]B "ブロックのソート"
        (マクロ本体)
*
73 [ESC]H "センタリング"
        (マクロ本体)
*
74 [ESC]K "全角スペースの表示"

        (マクロ本体)
*
75 [ESC]T "文字トレース"
        (マクロ本体)
*

※ マクロの開始宣言「* M」は、先頭のマクロで1度だけ記述してください。実を言うと、「*」だけでも結構です。version 1.02までは「* M」をチェックしていましたが、version 1.50から簡略化しました。

 ただし、ローカルマクロ(複数のマクロから共有するサブルーチン)やメニューの位置や書き方には気をつけなくてはなりません。

呼び出し元と呼び出し先を区切ってはいけない

 たとえば、block.defを次のように区切ると、エラーになります。

* M マクロ
59 [ESC]K "【矩形ブロック】 [ESC]K"

        !01
*
60 ^KB "矩形ブロックモード"
        ?. #b (mb)?{ mb=4, xb=lx, }
*
61 ^Y [F08] "矩形ブロック削除"
        m-, >01
*
62 ^KK \[F08] "矩形ブロック記憶"
        m+, >01
1:      (ローカルマクロ本体)
*
63 ^J [F09] "矩形ブロック挿入"

        (マクロ本体)
*
65 [ESC]] "行末のSPACE・TABの削除"
        (マクロ本体)

* P メニュー
1       "",34,3,22
        &61 &65
        "TAB→SPACE変換  ",Eu
*

 ローカルマクロ「1:」は「61」と「62」から共用しています。それを「*」で区切ると、「61」からローカルマクロ「1:」を呼び出せません。いっしょに読み込んでいないのですから当然です。「61」と「62」の間は区切ってはいけません。

 「59」からメニューの「1」も呼び出すこともできません。「!01」のようにビックリマークがあるマクロはメニューを呼び出しているので、「* P」の部分を近づけてください。

* M マクロ
59 [ESC]K "【矩形ブロック】 [ESC]K"
        !01
* P メニュー
1       "",34,3,22
        &61 &65
        "TAB→SPACE変換  ",Eu
*
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

 メニューを呼び出すという意味ではこれでよいのですが、実はまだ問題があります。「&61」「&65」は「61」「62」のマクロを呼び出しています。いっしょに読み込まれていません。block.defに関する限り、「*」区切りは使わないでください。tool.defでも事情は同じです。

グローバルマクロ番号とローカルマクロ番号の重複を避ける

* M マクロ
1 ^KE    "macro 1"
        (グローバル)
1:      (ローカル)
2:      (ローカル)
10:     (ローカル)

* P メニュー
1       (メニュー1)
2       (メニュー2)

*
2 ^KM    "macro 2"
        (グローバル)
*
10 ^KN   "macro 10"

        (グローバル)
*

 この例で、「"macro 2"」を実行しようとして「nn=2,」を指定しても、outlawはグローバルとローカルの区別をしないので、「"macro 1"」のローカルマクロ「2:」を実行します。あるいは、メニューの2番にひっかかります。これを回避するには、ローカルマクロやメニューの番号に0を書き足してください。

* M マクロ
1 ^KE    "macro 1"
        (グローバル)
01:     (ローカル)
02:     (ローカル)
010:    (ローカル)

* P メニュー
01      (メニュー1)

02      (メニュー2)

*
2 ^KM    "macro 2"
        (グローバル)
*
10 ^KN   "macro 10"
        (グローバル)
*

 こうすれば、outlawのマクロ番号検索がスキップします。「10:」を「010:」と書くのは奇態ですが、動作に支障はありません。「すべてのローカルマクロに0を書き足すのは面倒だ」と思うかもしれませんが、小物マクロは普通ローカルマクロを多用しませんし、ローカルマクロを多用したマクロはどだい小物マクロではないのですから、別のファイルにするべきでしょう。

モード型マクロを実行中に小物マクロを組み込み・実行する

 「モード型マクロを実行中に、新たにマクロを組み込んではいけません」と前に書きましたが、実はこの制限をとりはずす機能も用意しています。

 モード型マクロ実行中に組み込むマクロ番号は 1〜49 にする

 ここで言う「マクロ番号」とは、外部マクロファイル内のマクロ番号(nnで指定)のことです。

 通常outlawはすべての外部マクロをマクロ番号「89」に変更して組み込みますが、nnが1〜49の場合には「119」に変更します。すると、以前の「89」のマクロは上書き・消去されずにすむのです。

 ただし、すでに大きなマクロを組み込んでいるときに、さらに大きなマクロを組み込もうとすると、マクロバッファが不足して、不正な動作をする危険があるので、小物マクロでの使用にとどめたほうがよいでしょう。

ここで重要な注意事項があります。

 モード型マクロを nn=1〜49 で組み込んではいけない

 小物マクロ(nn=1〜49)で上書き・消去される危険があります。

 vz.defの内部マクロ^KJ文字コード表示」はサイズは小さいですが、モード型マクロなので、nn=1〜49で登録してはいけません。

6-6 VZ.DEFダイエット大作戦

 outlawは外部マクロを瞬時に組み込み・実行するためのマクロですが、vz.def内部のマクロを外に追い出す目的にも利用できます。

標準のvz.defをダイエット

 標準のvz.defの中には、けっこう長いマクロがあります。

6  [ESC]D       "編集中テキストの二重化"

        (マクロ本体)

8  [ESC]I  "I カーソル位置へ挿入"
        (マクロ本体)

1 [F10] "ヘルプ"
        (マクロ本体)

 これらを外部に追い出せば、vz.defは身軽になって、マクロバッファ(Bm)のフリーエリアを思い切って拡大できます。それぞれのマクロを外部マクロファイルに仕立てて、vz.def内には次のような記述だけを残します。

6  [ESC]D       "編集中テキストの二重化"
        dd="esc_d", nn-, >88

8  [ESC]I  "I カーソル位置へ挿入"
        dd="esc_i", nn-, >88

1 [F10] "ヘルプ"

        dd="help", nn-, >88

 この3つ以外はたいして大きなマクロではないので、内部においたままでかまいませんが、マクロタイトルの省略は励行してください。

メニュー消失に備える

 ダイエットを兼ねて、VZの使い勝手も改善できます。

 外部マクロを使った後に、ヘルプをはじめ【ファイルメニュー】【モードメニュー】【サブメニュー】などのメニューが出なくなり、画面左下に「!01」などと表示されて途方に暮れた経験はありませんか? これは外部マクロの不用意な組み込みで、マクロバッファの一部が消えてしまったために起こる現象です。【ファイルメニュー】【モードメニュー】などは小さなマクロですが、outlawで外部に追い出せば、そのような心配もなくなります。

 vz.def内には次の記述を残します。

2  [F01] "【ファイルメニュー】"
        nn=2, >01

3 \[F01] "【モードメニュー】"
        nn=3, >01

4 \[F02] "【サブメニュー】"

        nn=4, >01

0:      dd"f_menu", >88

 f_menu.defは次のようなマクロになります。

==== f_menu.def ====
* M マクロ

2  [F01] "【ファイルメニュー】"
        ?. !01
* P メニュー

1       "",24,14 #70 #73 #75 #72 #71 #74 #76 #82 &06 &07 &08 &09 #78 #77
*
3 \[F01] "【モードメニュー】"
        ?. !02

* P
2       "",30,15,6
        "C CR の表示",Dc
  〜〜〜〜〜〜〜〜〜〜(中略)〜〜〜〜〜〜〜〜〜
        "P ページ長",PG
*
4 \[F02] "【サブメニュー】"

        ?. !03
* P
3       "",26,9  #45 #51 #52 #54 #67 #68 &15 #79
        " $4EMS free/total: $ef/$em"
*

※ 「&06」〜「&09」,「&15」はマクロを呼び出していますが、vz.def内のマクロなので、支障ありません。

6-7 マクロリンク(マクロの連携)

パイプ処理?

 次の2つのマクロをみてください。

 chkup.defは、パソコン通信などでアップするファイルに、桁折りを忘れた行がないかどうかチェックするマクロです。tabspace.defは、タブとスペースを変換するマクロです。

======== chkup.def by I.KAMIMURA ========
【桁折りチェック】

* M
89 ^\   "check upload file"
        ?.
        &s #^ #<
:A      #x
        (lh)? { &d &b(3) &m("line over !"). }
        (r)?? >A
        dd="tabspace", nn=51, >88

*
======== End of chkup.def ========
======= tabspace.def by I.KAMIMURA ========
【タブ・スペース変換】

* M
51 ^KM  "タブ→スペース変換"
        r=9, >01

52 ^KN  "スペース→タブ変換"

        r=32, >01

〜〜〜〜〜〜〜〜(後略)〜〜〜〜〜〜〜〜
*
======== End of tabspace.def ========

 chkup.defの最後にある「dd="tabspace", nn=51, >88」に注目してください。これはアップファイルのチェックが終わると今度はtabspace.defの51番のマクロを組み込み・実行する命令です。MS-DOSにたとえればパイプ処理です。

 この例ではchkup.def内部に記述しましたが、outlawを外側から使うこともできます。

50      "全角英大/小文字変換"
        dd"zenhan", nn-, &88            ; zenhan.def で半角に変換
        #a                              ; 語の先頭に戻る
        #23                             ; 英大/小文字変換(VZの基本機能)
        >*                              ; zenhan.def を再実行

 「>88」ではなく「&88」になっているのに注意してください。

 「>88」はoutlawにジャンプしたきり戻ってきませんが、「&88」だと戻ってきます。全角/半角変換後、カーソルは語尾に移動していますから、語の先頭に戻って、英大/小文字変換。そして「>*」でzenhan.defを再実行すれば、「全角英大/小文字変換」が実現します。

6-8 無法者DEFの動作原理

手順

 外部マクロファイルを呼び出して、再カスタマイズする点など、基本的には「外部マクロの実行」([ESC]^)と同じです。

  1. dd="外部マクロファイル名",」を参照して、外部マクロファイルをオープンします。
  2. 論理行頭の「*」を検索します。いきなりマクロ番号を検索すると、「* M」の前に使用法やマクロの記述例など書いてあると具合が悪いからです。
  3. nn=実行したいマクロ番号,」を参照して、目的のマクロ番号を検索します。
  4. マクロ番号からファイルの先頭までブロック削除します。
  5. 先頭に次のようなダミーのマクロを書き込みます。
    * M
    89"">>
    

    ※ >> は、次に記述されているマクロへのジャンプ命令

  6. 再カスタマイズ(#80)してマクロを組み込んだのち、ファイルを破棄します。
  7. 最後に組み込んだマクロを実行(>*)します。「89 ""」を実行すると、ただちに「>>」命令で次に記述されているマクロに移行するという仕掛けです。

マクロ番号による直接ジャンプはしない

 「nn=実行したいマクロ番号,」を参照して、「>nn」で直接ジャンプしようとすると、すでに同じ番号のマクロがバッファにあった場合に、そちらへジャンプする危険があります。「>>」なら番号ではなく、相対的な位置関係でジャンプします。

同じマクロ番号に上書き

 「89 "">>」というダミーマクロは、outlawでマクロを呼び出すたびに、同じマクロ番号に上書きすることによって、マクロバッファがあふれないようにする重要な役割をもっています。

 この「同じマクロ番号に上書き」する機能は、outlawの機能ではなく、VZの仕様です。外部マクロファイルの最初にあらわれるマクロ番号が、すでにマクロバッファに存在する場合には、そこに上書きします。(マニュアル11-10)

6-9 EXKEY.DEF

無法者DEFの強力な相棒
疑似マクロキーを増設して
キーアサインの悩みを解消

付録FD: EXKEY.DEF EXKEY.DOC

【機能】

outlawで実行したい外部マクロに英数字キー2個を割り当てて「exkey.###」というデータファイルに登録しておき、「疑似2ストロークキー」でマクロを組み込み・実行できます。

 outlawは、vz.defに「dd="outside",nn=0,>88」といった短い書式を登録するだけで、外部マクロを自在に組み込み・実行することができますが、むやみに登録をつづけると、いつ「メモリが足りません」攻撃に見舞われるかしれません。また、キーアサインの悩みもついてまわることでしょう。

 exkey.defを使えば、書式の一覧を外部に追い出したうえに、単純計算で36×36=1296個の疑似キーを増設することができます。

exkey.def自身もoutlawで実行できます。

 vz.defに次のように記述してください。

84 [ESC][ "exkey"
        dd="exkey", nn=0, >88

※ キーアサイン[ESC][は、[ESC]+'['を意味しますが、[ESC]を2度押しても同じです。

データファイルの作成

 メニュー用のデータファイル「exkey.###」をvz.defと同じディレクトリにおいてください。データの書式は次の通りです。

--------( exkey.### )--------
KB      kblock3 0       メニュー式矩形ブロック(アンドゥ・登録可)
SK      seikei8 0       メニュー選択。1行整形両用
FM      form    0       手のひらサイズの1行整形
NM      nm12    0       ログ閲覧+ポストファイル作成
EP      express5        0       高速マクロファイル圧縮
ID      idea    0       アイデアプロセッサ
EP      express5        0       高速マクロファイル圧縮
EP      express5        高速マクロファイル圧縮
EP      express5

※ ファイル名の次に数値がない場合は、マクロ番号0(外部マクロファイルの最初のマクロ)を指定したことになります。

マクロ選択の操作

 実行すると、画面左下に次のようなメッセージがでます。

key:

編集モード以外でも使うことができます。

 いったん「exkey.###」をオープンしますが、選択後クローズして、モードに復帰します。

6-10 MACMENU.DEF

無法者DEFの強力な相棒
マクロを階層メニューで選択
キーアサインの悩みを解消

付録FD: MACMENU.DEF MACMENU.DOC

【機能】

outlawで実行したい外部マクロを「macmenu.###」というデータファイルで階層管理します。特定の英数字キーを数タッチ押せば、マクロを組み込み・実行できます。

 outlawは、vz.defに「dd="outside",nn=0,>88」といった短い書式を登録するだけで、外部マクロを自在に組み込み・実行することができますが、むやみに登録をつづけると、いつ「メモリが足りません」攻撃に見舞われるかしれません。また、キーアサインの悩みもついてまわることでしょう。

 macmenu.defを使えば、書式の一覧を外部に追い出したうえに、疑似キーを自由に増設することができます。

macmenu.def自身、outlawで実行できます。

 vz.defに次のように記述してください。

85 [F05] "macmenu"
        dd="macmenu", nn=0, >88

メニュー用のデータファイル「macmenu.###」をvz.defと同じディレクトリにおいてください。メニューの書式は次の通りです。

--------( macmenu.### )--------
80
block
        kblock3 0       メニュー式矩形ブロック(アンドゥ・登録可)
text porcessor
        seikei8 0       メニュー選択。1行整形両用
        form    0       手のひらサイズの1行整形
log view
        nm12a   0       ログ閲覧+ポストファイル作成
filer
        u futi  0       ファイル日付情報変更など(糧 丞氏)
        v fview 0       ページャ(まーすけ氏)
macro utility
        express4        0       高速マクロファイル圧縮
idea processor
        idea    0       アイデアプロセッサ
        chu     0       脚注
keisen
        oaskei  0       オアシス罫線(Aiming Off 氏)
        line    0       始点・終点式(くらと氏)

メニュー選択の操作

 実行すると、「macmenu.###」がオープンし、次のようなメッセージがでます。

<<< macmenu MODE >>> [A-Z][0-9] or [CR]:Jump [BS]:Back \[Esc]:Edit [Esc]:Quit

編集モード以外でも使うことができます。

 いったん「macmenu.###」をオープンしますが、選択後クローズして、モードに復帰します。