Vz Editor
2005-12-26T13:44:18+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」が便利でしょう。

編集モードでの #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は自動インデント無効で改行 (98のカナキー,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.