Vz Editor
2005-11-14T20:54:54+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 を使うこともあるまいと思います。

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

キーアサインテーブル

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

コマンドキーやマクロキーにそのまま使えるキーは,[Ctrl]キーおよび[ALT]キー(PC-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-PC98?1シリーズのキーボードには[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 ^- で入力しても同じなのでしょうか。ご教示ください。


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