Vz Resources
Commands
2018-09-09T13:57:10+09:00

コマンド拡張で学ぶVZマクロ入門 #00

番号記号初期キー機能
#00^Q ^K [ESC]2ストロークキー

コマンド番号#00はプリフィクスキーの指定になっており,「コマンド」のイメージとかけ離れている。設定されたキーがある条件下で押されると,プリフィクスキーとしてのコードを発生する機能を持っているコマンド…ということになるのであろうか。特殊なコマンドの中でもとりわけ毛色が違っているため解説も苦しいのだが,ここではプリフィクスキーにまつわる話をさせていただこうと思う。

製品版サンプルVZ.DEFでは以下のようになっている。

00      ^Q ^K [ESC]     ;2ストロークキー(最大6個)

他のコマンドと決定的に異なるのは指定できるキーの数が多いことだが,それだけでなく説明文の前がセミコロンだということだ。注意深い人は気付いていることと思う。通常,コマンドキーメッセージはコロンを前置することになっており,ヘルプメニューなどで表示できるようになっているが,#00だけはセミコロンが前置されている。

実は,コマンドキーメッセージはマクロバッファに読み込まれていて,結構な量のメモリを消費している。#00と同様にすべてセミコロンで区切ると,マクロバッファが1300バイト程度余分に確保できることだろう。とは言ってもサブメニュー(\[F02])などが空アイテムだらけになってしまうので,あまりおすすめできるようなことではない。マクロバッファがぎりぎりで困っている人は,適当にコロン以下の文字数を減らしてみるとよいだろう。

プリフィクスキーの増設

さて,プリフィクスに話を戻そう。

[ESC]は編集モードでは通常プリフィクスキーとなるが,Ep(編集モード時の[ESC]の扱い)によって終了命令としても機能する。編集モード以外では#03に割り当てられたエスケープとしてはたらく。

プリフィクスキーの数を増やしたい場合は,[CTRL]+英字で唯一空いている ^O を4番目の2ストロークキーにするのがお奨めだ。他に[CTRL]+英字で増やしたい場合は,#21に割り当ててある ^I を外して,プリフィクスとするのがよいだろう。独立した特殊キーで[TAB]があるのだから,何も好んで ^I を使うこともあるまいと思う。

NEC-98の場合は,EZKEY.comをNオプションつきで常駐すれば使用できる[NFER]が,プリフィクスに向いている。IBM-PCでも高橋版なら[無変換][NFER]として利用できるので,プリフィクスキーに登録することができる。ただし,決して6番目のプリフィクスキーに設定してはならず,^Q/^K/[ESC]/^O/[NFER]/^Iのように順序を変更しなければならない。(この理由は後述。)

キーアサインテーブル

ここで,VZのキーアサインテーブルについて少し説明しておく。

コマンドキーやマクロキーにそのまま使えるキーは,[Ctrl]キーおよび[ALT]キー(NEC-98ではEZKEY.comの常駐が必要)と,普通に入力できる文字キーとの組み合わせになる。「普通に入力できる」というのは基本的にASCIIとなるわけだが,アルファベットといくつかの記号で構成されている。

ASCII一覧(7ビットで表現できる範囲のうち制御文字を除く)
上位\下位+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
20h:!"#$%&'()*+,-./
30h:0123456789:;<=>?
40h:@ABCDEFGHIJKLMNO
50h:PQRSTUVWXYZ[\]^_
60h:`abcdefghijklmno
70h:pqrstuvwxyz{|}~

これらのうち,40hから5Fh,つまり'@'および'['から'_'までの記号を含むアルファベットが,キーボードから直接入力できるキーとして使われる。これらのコードが連続しているところがキモである。もしも他の記号を含めようとすると,コードが飛んでしまううえに,きりのよい数にならないため,プログラムの配列で非常に扱いにくいという問題が発生するに違いない。

さて,[CTRL]と前述の文字(以下,記号も含めて「英字」と称する。)を組み合わせると,^@から^_の32種類の機能に割り当てることができる。これらの組み合わせは,内部的なコード表であるキーアサインテーブルの00h番から1Fh番に配置されている。

次に,[ALT]と英字の組み合わせは,@@から@_が使用でき,キーアサインテーブルの20h番から3Fh番に配置される。(@\,@^,@_,^[ESC]使用不可)

なぜプリフィクスキーは6つまで?

キーアサインテーブルの[CTRL]+英字[ALT]+英字の次に位置するのは,プリフィクスキーである。

1番目のプリフィクスキーが配置されるのは,40h番から5Fh番。

+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+40^Q@^QA^QB^QC^QD^QE^QF^QG^QH^QI^QJ^QK^QL^QM^QN^QO
+50^QP^QQ^QR^QS^QT^QU^QV^QW^QX^QY^QZ^Q[^Q\^Q]^Q^^Q_

2番目のプリフィクスキーが配置されるのは,60h番から7Fh番。以下,前の表とほとんど同じなので省略する。

3番目のプリフィクスキーが配置されるのは,80h番から9Fh番。

4番目のプリフィクスキーが配置されるのは,A0h番からBFh番。

5番目のプリフィクスキーが配置されるのは,C0h番からDFh番。

6番目のプリフィクスキーが配置されるのは,E0h番からFEh番。

これで16ビット・255個の値にキーの割り付けが完了する。注意深い人は,ここで重要なことに気付くはずだ。そう,16ビットで表現される数は0から255の「256」個のはずだからだ。255個では,ひとつ足らない計算になってしまう。実はこの256番目は未定義となっていて使用することはできない。それで6番目のプリフィクスキーは,FFh番まででなくFEh番までの割り付けになっているわけだ。つまり6番目のプリフィクスキーと'_'の組み合わせは使えないので注意が必要である。

[NFER]の落とし穴

NEC-98シリーズのキーボードには[NFER]と刻印されたキーがあり,EZKEY.comを常駐させることでコマンドキーとして使用することができる。また,高橋版VZであれば,PC/AT106キーボードの[無変換]キーを,[NFER]として扱うことができるようになった。

この特殊キーをプリフィクスキーとして使用するのはなかなかお奨めである。[ESC]よりも押しやすい位置にあり,[ESC]がキャンセルキーとして機能する非編集モードでも使用でき,シフトキーだけでなく[ALT]キーや[CTRL]キーによる分岐もできてしまう万能キーなのだ。

ただし,ひとつだけ注意する点がある。この[NFER]はプリフィクスの2番目のキー(プリフィクスキーを押した後に押すキー)として使用すると,'_'と同じキーコードを発生する。ということは,もしも6番目のプリフィクスキーとして[NFER]を設定した場合,[NFER]を2度続けて押すことで禁断の未定義キーとして機能することになるのだ。

未定義キーを使用すると,マクロの動作が非常に不安定なものになり,実行ポインタがずれまくって予期しないコマンドやマクロを実行してしまうなど,一種の迷走状態になるので,6番目のプリフィクスに[NFER]を定義しないようにしなければならない。もちろん6番目のプリフィクスを押した後に[NFER]が押されれば未定義キーになるのだが,その危険性は無意識に押してしまう可能性の高い[NFER]連続押しの比ではない。

プリフィクス+特殊キー

前述の[NFER]のように,プリフィクスの2番目のキーとして特殊キーが押された場合,その発生するキーコードによっては別に定義されたキーとみなされる場合がある。

代表的なところで,以下のようなものがある。

キー文字連想キー
[ESC]'['[ESC]=#[^Q[ESC]^Q[
[ESC][ESC][ESC][
[CR]'M'[CR]=^M^Q[CR]^QM
[TAB]'I'[TAB]=^I^Q[TAB]^QI
[NFER]'_'?[NFER][NFER][NFER]_

プリフィクス^Qを押してから,それをキャンセルするつもりで[ESC]を押したら,カーソルが行頭へ飛んでしまった。このような経験は誰でも持っていることだろう。これらのケースへの対策は,覚えて逆に利用することくらいで,有効な対策はあまりないというのが実情だと思われる。

利用例
[ESC]を二度連続で押すと,挿入モードとページングモードを初期値に戻す (m.gann氏公開のmgann.defから引用)
37 [ESC][ ""    ;Clear & Disp (28)      ;2[ESC]
        ?. mi=mp-, &d cm[, #] cm],

使えるキーの組み合わせは決まっている

VZはコマンドとマクロそれぞれひとつの機能にふたつの実行キーを割り付けることができるが,その割り当てにはシステム上の制限がある。次の表はキーの値が割り当てられている範囲である。英字とは,先に示したとおりA〜Z@,[,\,],^,_の6つの記号併せて32字だ。

英字キーキーの値
[Ctrl]+英字00h〜1Fh
[Alt]+英字20h〜3Fh
Prefix-1+英字40h〜5Fh
Prefix-2+英字60h〜7Fh
Prefix-3+英字80h〜9Fh
Prefix-4+英字A0h〜BFh
Prefix-5+英字C0h〜DFh
Prefix-6+英字E0h〜FEh

キーの値は1バイトの値の範囲であるから,これらの英字キーで255個の箱はすべて埋まっていることになる。いや?ちょっと待った。VZはファンクションキーや特殊キーも使えるではないか。これらのキーの値はどうなっているのだろうか。

VZが認識する特殊キーは,以下の通りである。

これらの特殊キーの値は,3番目以降のプリフィクスキーの値と同じになる。

プリフィクスキーと特殊キーの値
英字キーキーの値特殊キー
[Ctrl]+英字00h〜1Fh
[Alt]+英字20h〜3Fh
Prefix-1+英字40h〜5Fh
Prefix-2+英字60h〜7Fh
Prefix-3+英字80h〜9Fh[特殊キー]
Prefix-4+英字A0h〜BFh[Shift]+[特殊キー]
Prefix-5+英字C0h〜DFh[Ctrl]+[特殊キー]
Prefix-6+英字E0h〜FEh[Alt]+[特殊キー]
キー値表
80h[F01][F02][F03][F04][F05][F06][F07][F08][F09][F10][F11][F12][F13][F14][F15]
90h[RLDN][RLUP][INS][DEL][UP][<--][-->][DOWN][HOME][END][ESC][TAB][BS][CR][NFER]

3番目のプリフィクスキーと同じ値を特殊キーが共有する。

+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
80h[F01][F02][F03][F04][F05][F06][F07][F08][F09][F10][F11][F12][F13][F14][F15]
90h[RLDN][RLUP][INS][DEL][UP][<--][-->][DOWN][HOME][END][ESC][TAB][BS][CR][NFER]

4番目のプリフィクスキーと同じ値を[Shift]+特殊キーが共有する。

+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
A0h\[F01]\[F02]\[F03]\[F04]\[F05]\[F06]\[F07]\[F08]\[F09]\[F10]\[F11]\[F12]\[F13]\[F14]\[F15]
B0h\[RLDN]\[RLUP]\[INS]\[DEL]\[UP]\[<--]\[-->]\[DOWN]\[HOME]\[END]\[ESC]\[TAB]\[BS]\[CR]\[NFER]

5番目のプリフィクスキーと同じ値を[CTRL]+特殊キーが共有する。

+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
C0h^[F01]^[F02]^[F03]^[F04]^[F05]^[F06]^[F07]^[F08]^[F09]^[F10]^[F11]^[F12]^[F13]^[F14]^[F15]
D0h^[RLDN]^[RLUP]^[INS]^[DEL]^[UP]^[<--]^[-->]^[DOWN]^[HOME]^[END]^[ESC]^[TAB]^[BS]^[CR]^[NFER]

6番目のプリフィクスキーと同じ値を[ALT]+特殊キーが共有する。

+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
E0h@[F01]@[F02]@[F03]@[F04]@[F05]@[F06]@[F07]@[F08]@[F09]@[F10]@[F11]@[F12]@[F13]@[F14]@[F15]
F0h@[RLDN]@[RLUP]@[INS]@[DEL]@[UP]@[<--]@[-->]@[DOWN]@[HOME]@[END]@[ESC]@[TAB]@[BS]@[CR]@[NFER]

標準組込28番マクロの謎(プリフィクス+数字キー)

オリジナルのVZ[IBM[J]].defを眺めていると,次のような奇妙な設定文があることに気付くと思う。

28 [ESC]0 ""

これをこのまま解釈すると,[ESC]を押して次に'0'を押したときには,「何もしない」ということになる。

「ふ〜ん,[ESC]+'0' ってのは押しちゃいけない組み合わせなんだな」

普通の人は,このように考え,敢えて触ってみようとは思わないだろう。実際,この設定文を削除した場合,はずみで[ESC]+数字というキーの組み合わせを押したりすると,VZが終了してしまう。

ところが,世の中には凄い人がいるもので,

[ESC]0 に機能を割り当ててみたが,正常に動くじゃないか」

…ということを確認する人がいたりするわけである。しかも,

「間違って[ESC]9で実行してしまったが,結果は同じだった」

…とか,

[ESC]と数字の組み合わせは,みな結果が同じだ」

…ということに気付く人まで現われる。

こういうことに気付くだけでも凄いと思うのだが,これで終わりではなかったところに,VZ先人の偉大さがあるのだろう。

[ESC]+数字のキーは,数値に応じた返り値が得られる」

「数字だけでなく,文字コード30hから3Fhの文字ならば返り値が得られる」

[ESC]だけでなく,^Q^Kなど,すべてのプリフィクスキーで同じ効用がある」

こういったことが黒田健司氏をはじめとする先鋭的マクロ師によって徐々に解明され,現在に至っているわけである。

ASCIIの一部 30h〜3Fhの表
上位\下位+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
30h:0123456789:;<=>?

30hから3Fhの文字とは,「0123456789:;<=>?」であり,返り値によって分岐することで,なんと16種類の機能を割り当てることが可能だ。なかには16種類で満足できずにフラグによる分岐までからめてしまう達人(例えば,M.Miyata氏)もおられるが,普通は割り当てた機能を覚えきれないので16分岐にとどめておいたほうがよいだろう。

なお,寅次氏は一般的なコマンドのオプション"/?"がヘルプであることから,'?'をヘルプとしての機能を持たせるという素晴らしい発想に至った。

そこで,今回は寅次氏の発想をかりて,ヘルプの表示から1度だけ再入力できるように考えてみた。メッセージラインに表示できるのは80字未満だから,'0'〜'9'には数字から連想可能な機能を割り当てて,残りの記号についての説明をするのが現実的だと思われる。

----------^ esc0test.def ( date:2003-04-08 time:21:39 ) ----< cut here
= ESC0test.def = by H_ear
#if 0
[ESC]0の雛形
'0'〜'9',':',';','<','=','>' に機能割当て。
'?'は機能忘却時のヘルプとし,1度だけ入力待ちを行う。
再度の'?'入力は許容せず,その他のキーと同様にキャンセル扱いとする。
#endif
* mad for vz!
1 [ESC]0 ""
        (r)>?{
            >00 >01 >02 >03 >04 >05 >06 >07 >08 >09 >10 >11 >12 >13 >14
            &15                         ;'?'はヘルプ用にコール
        }
        (r<0||r>14)?{ &m("cancel") . }  ;'?'を含む無効なキーならキャンセル
        >^
; ---- 以下のローカルマクロに機能を設定する ----
0:      &m("0")
1:      &m("1")
2:      &m("2")
3:      &m("3")
4:      &m("4")
5:      &m("5")
6:      &m("6")
7:      &m("7")
8:      &m("8")
9:      &m("9")
10:     &m(":")
11:     &m(";")
12:     &m("<")
13:     &m("=")
14:     &m(">")
15:     &m("入力可能なキーは 0123456789:;<=> です.")    ;80字未満でメッセージ
        mx+, &p (r-'0') mx-,            ;1度だけ入力待ち
*

[History]
2003/04/09 0.10 へっぽこ講義ノートのサンプルとして作成

[Notes]
通常はジャンプで,'?'のヘルプだけコールするのがミソ。
プリフィクス+'?'をヘルプにする寅次氏のアイデアを発展させたもの。
----------$ esc0test.def ( lines:41 ) ----------------------< cut here

PC/ATのキー設定は何故キーボードの刻印と異なるものがあるのか

わたし自身 IBM PC/AT 互換機を使うようになったのは,名機 IBM ThinkPad 220 が既に市場から消えかかっていた1995年のことだ。106キーボードが出現して数年を経ており,それ以前の英語101キーボードには触れたことすらなかったのだが,この英語101キーボードの配置が現在の106キーボード以降と異なっているのだそうだ。キーボードに刻印された文字(ASCIIとして出力される文字)の配置が変更された一方で,機械的にキーボードが発生するコードそのものは変更がなかったのである。それによって,同じキーコードを得るために押すキーの「位置」は変わらなくても,どのキーを押すか説明するためには刻印されている文字を示さなければならなかったため,いくつかのキーにずれが生じたということになるだろうか。

キーの配列について別の言い方を借りると,英語キーボードはASCII配列で,日本語キーボードはJIS配列なのだそうだ。

実物を見たことがないので資料から想像すると,手前から数えて4段目のキー配列は以下の図のようになると思われる。

英語101キーボード(想像)
 ~
 !
 @
 #
 $
 %
 ^
 &
 '
 (
 )
 _
 +
106/109キーボード

 !
 "
 #
 $
 %
 &
 '
 (
 )
  
 =
 ~
 |

このため,^@^2^^^6^_^- で入力することになったということらしい。

ところで,101キーボードを使っている,あるいは使ったことのある人にお尋ねしたいことがある。

101キーボードで刻印通りのキー入力ができるとすると,これら3種類のキーはシフトキーを押しながら入力するということになるのだろうか。それとも,そのまま ^2 ^6 ^- で入力しても同じなのだろうか。是非ご教示いただきたい。

追記(2018-09-09):文太氏の情報によれば,シフトキーを押さずに,^2^6^- で入力するということである。


コマンド拡張で学ぶVZマクロ入門 #00
The VZ resources, valid XHTML 1.0 Strict. ©2005-2018 by mezala.