Vz Resources
Commands
2018-09-09T18:21:20+09:00

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

番号記号初期キー機能
#04#m^M [CR][リターン],[Enter],[復改]

s==0(編集モード)

[CR][Enter])キーに割り当てられたコマンドとして一般的な「改行」コードの挿入を実行する。

戻り値 r: 0=改行挿入,-1=上書きモードにより改行コードを出力しない

VZが挿入する改行コードは 0D0Ah([CR+LF]) でだが,VZは 0Ah([LF])だけの改行にも表面上は対応している。「表面上」という理由は以下の通りである。

\n」を使用して一括置換を行う前には,改行コードを 0D0Ah に統一しておかなければならない。改行コード統一には,上村郁夫氏作成の「0D0A.def」が便利だろう。

======== 0d0a.def ======== by I.Kamimura
#if 0
【改行コード統一】(Vz Ver 1.5-1.6 共用)
 ● Mac の「^M」にも対応
#endif
* M
89 ^\   "【改行コード統一】"
        ?.
        (dz==gz)? jx[-,                 ; VZ1.6+VWX 対策 zh-, rx-,
        #56 "\n" #m "\l" #m "AY"        ; CR,LF --> LF
        #56 "\r" #m "\l" #m "AY"        ; CR --> LF
        #56 "\l" #m "\n" #m "AY"        ; LF --> CR,LF
        (dz==gz)? jx],
*
======== End of 0D0A.def ========

編集モードでの #04(#m) は,mi(挿入モード)により動作が変化する。

mi==0(挿入モード時)

改行コードの入力と次の論理行頭への移動([CR+LF])を行う。Ei(オートインデント)有効,Ej(全角オートインデント)有効により,字下げを行う。

mi==1,2(上書きモード時)

次の表示行頭へ移動し,改行コードの入力は行わない。当然,字下げも行わない。戻り値rには,-1がセットされる。

s==1(文字列入力モード)

入力文字列を確定して使用しているバッファに格納する。ただし,文字を何も入力せずに[CR]のみ入力した場合,戻り値rには,-2がセットされる。

s==3(ファイラーモード)

非選択時:カーソル位置の1ファイルをオープンする。ディレクトリ名上ではそのディレクトリに入り内容を表示する。<DIR> ..\ 上では親ディレクトリに戻る。

システムメニュー9番(vzfl.defに入っている)「拡張子による自動実行」の設定により関連するコマンドを実行する場合がある。com や exe のように小文字登録の場合,[CR]で即座に実行される。

選択時:選択ファイルをオープンする。

なお,v1.6以降はファイラーの複窓双方から同時にファイルを選択できるようになった。

なお,システムメニュー9番に登録されたバイナリファイルであってもオープンされる。変更を施すとファイルが破壊されて正常な実行ができなくなるので注意が必要である。念のため #67^KR:リードオンリーモード)などでリードオンリーモードかビューモードに変更してから閉じるとよいだろう。

s==4(メニュー)

メニューカーソル上のアイテムを選択する。これはメニューにおけるコマンドキーの例外([UP][DOWN][CR])に当たり,他のコマンドキーがメニューをキャンセルするのに対して,意味のある特定の動作をする。

s==4(問い合わせ)

オプションSy(問い合わせ時のキー入力)を有効(+)にすると,問い合わせに対して応答できるようになり,'y'の入力と解釈される。

オプションYN(問い合わせ時のキー入力の逆転)を有効(+)にすると,yes/noが逆転した応答になり,'n'の入力と解釈される。

マクロによる拡張

^Mの場合はSHIFT/CTRL押下を利用して,変数ksの各ビットの値により分岐を行う手もある。\[CR]^[CR]はまったく別のキー定義で,初期キーでは\[CR]#53(#n)#98に,^[CR]#97に割り当てられている。したがって[CR]の方でシフトキーを利用して処理を分岐させることはできない。

例-1
シフトキーを押しながら^Mを押すと自動インデントを無効にして改行
4 ^M [CR] "Enter"
        ?. (ks&1)?Je[-, #m ?. Je],
例-2
[CR]は自動インデント有効,^Mは自動インデント無効で改行 (NEC-98のカナキー,IBM-PCのSCRLキーがロックされていないこと)
4 ^M [CR] "Enter"
        ?. Je[+, (ks&20)?Je-, #m Je],
変数Jeは編集スイッチの一括保存・復帰用変数で,Ei(自動インデント)とEj(2バイト空白の自動インデント)の双方を制御することができる。変数Jeの詳細情報は「変数・オプション・スイッチ一覧」のJeの項を参照していただきたい。

次の例は辛口マクロ師である m.gann師のマクロである。

シフトキーを押しながら^Mを押すと行を折る(改行を挿入する)というものだが,プッシュ・ポップの順序などに注目してほしい。

4 ^M [CR] "Enter"
        ?. (ks&1)?Je[=mi[-, #m #< #s ?. Je], mi],

次の例はYASAT氏のマクロである。

オートインデントを有効にした状態で作られてしまう空白文字だけの空行を,空白文字もないきれいな空行にしてくれるというものだ。非公開オプションのEl(行末のスペース・タブを自動削除)を使用するために,いったんラインバッファに入っているところがキモである。

引用元:NIFTY:FGALDC/MES/13/09817(2004-02-07T22:14:00+09:00)

80 [CR] ""
        ?.
        el[+, #28 #m el],

なお,YASAT氏はEiだけでなくEj(全角空白のオートインデント)にも対応するべく,機械語を駆使したマクロも作成している。ちょっと凄すぎるのだが,参考までに引用しておこう。

引用元:NIFTY:FGALDC/MES/13/09817(2004-02-07T22:14:00+09:00)

80 [CR] ""
        ?.
        (ct<2)?{
                #28 si=wm+230,
                &i("$(33,C9,AC,3C,0D,74,17,3C,0A,74,13,3C,09,74,F3,3C)$
                $(20,74,EF,3C,81,75,05,AC,3C,40,74,E6,FE,C1,C3)")
                (cx)??#H
        }
        #m

さて,オートインデントによる空白文字行を空行にするというマクロの原型は「じょんたま改行」と呼ばれるマクロである。ある意味こだわりの機能で,y.mikome氏のWD.defやEmmett氏+くらと氏のfreeform.defといった整形マクロには装備されているものだ。この「じょんたま改行」を以下に示す。

引用元:NIFTY:FGALPK/MES/03/03559(1993-09-11T23:00:00+09:00)

80 [CR] ""
        ?.#mlx[,#e(ct<2)?{&s' '#16#?}kx],#x

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