Vz Editor
2007-04-11T06:20:12+09:00

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

番号記号初期キー機能
#21-^I [DEL]タブの出力

s==0(編集モード)

Eu([TAB]をスペースに変換)が無効であれば,タブ(制御コード09h)をカーソル位置に出力する。Euが有効な場合は,タブストップ位置まで1個以上のスペース(1バイト空白コード20h)を出力する。

mi(挿入/上書きモード)が0であればEuに応じた空白文字が出力され,miが1あるいは2なら次のタブ停止位置まで移動する。

戻り値r:常に0

タブ停止位置を決定するタブ桁幅を制御する変数は3つある。指定できる値はいずれも2のべき乗で最大64。

タブ桁幅を制御する変数
変数適用ファイル適用タイミング
Ta通常のファイルオープン時
Tb*E(その他セクション)3番で指定するデフォルトのテキスト拡張子のうち,先頭文字を大文字で指定したファイルオープン時
Ht編集中のファイルごと編集中随時,オープンイベント

マクロの中で使用することは可能だが,環境によって振る舞いが変わることに注意しなければならない。確実にタブコードを出力するためには,&o(9)を使用するのがよい。文字列中に混在させるには$(9)を使用したり,出力時に引数を直値9として%cで出力させる。

        &?("abc$(9)def%c",9)
出力結果:
abc→   def→   
(「→」はタブコード)

なお,初期アサインされたキー^Iは,プリフィクスキーとして転用されることが多い。

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

編集モードと同じ

s==2(コマンドラインモード)

編集モードと同じ

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

無効

初期アサインされたキー[TAB]は複窓間の移動に使用されている。

s==4(メニュー)

メニューを閉じて,戻り値をrにセットする。(下位7ビットがコマンド番号)

→メニューの戻り値に関する説明

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

無効

マクロによる拡張例

次のm.gann師のコードは,振る舞いの変化を総動員で利用したものである。敢えてプッシュ・ポップを使用しない,動きを見切った最短コードが見事だ。

21 ^[TAB] ""    ;Spc_Tab (39)           ;[\] Jump_Tab
        ?.
        (ks&1)?mi!,     ;シフト起動なら挿入/上書きモードを逆転する
        eu!, #21 eu!,   ;タブ/スペース出力を切り替える
        ?.              ;通常起動ならここで終了
        mi!, #]         ;逆転した挿入/上書きモードを元に戻す

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