Vz Editor
2007-04-25T05:24:44+09:00

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

番号記号初期キー機能
#29#?-再表示

s==0(編集モード)

サイレントフラグを無効にしてカーソル行を再表示する。画面全体を再表示する&dよりも速度の点で有利である。

ラインバッファに入る機能があるダミーコマンドであるが,#26〜#28と異なるのはビューモード(mr==$80)でも有効なことだ。ビューモードであっても,#29でラインバッファに入り,cpを足掛かりにしてカーソル行を書き換えたのち#29で再表示できてしまう。 カーソル行をラインバッファに入れるという働きは,#04〜#29 に共通した機能であるが,#29はビューモードでもラインバッファに入れるダミーコマンドとして特異なコマンドである。

ビューモード(mr==$80)でもカーソルをラインバッファに入れることができる反面,再表示という副作用があるので,ビューモードでは無効だが副作用のない#28との使い分けをする。

コマンドサイレントモードビューモード
#29(#?)オフにして再表示有効
#28変更しない無効

編集スイッチEn(カーソルを改行以降に表示しない)が無効(初期値)であるとき,lx(表示カーソルの桁位置)とkx(保存した表示カーソルの桁位置)を一致させる効果があるので,カーソルを移動させることなくカーソル位置を正規化する目的にも使用できる。

戻り値 r:0=行編集開始, -1=ラインバッファがいっぱい

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

編集モードと同じ

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

編集モードと同じ

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

無効

s==4(メニュー)

メニューを閉じて,キーに応じた戻り値をrにセット(下位バイトがコマンド番号を示す)

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

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

無効

マクロでの利用例

初期キーが与えられていない(特にキーを与える玄人も存在する)ダミーコマンドであるため,拡張ではなく利用例を示す。

m.gann師のカーソル以降の一括小文字/大文字化

23 ^OW  ""      ;Case lower (50)        ;[\] Upper
        ?. #? (r)?. wa..19.2-,          ;bend
        (ks&1)?&Su(cp) ?&Sl(cp) #?

解説を加えておこう。

?.編集モードでなければ終了
#?ラインバッファに入る(cpがラインバッファの中を指す)
(r)?.エラー(ラインバッファ飽和)なら終了
wa..19.2-,ラインバッファの終端の先にヌルを埋め込む(ラインバッファを「文字列」として扱えるようにする)
(ks&1)シフトキーフラグを評価して
?&Su(cp)真ならカーソル位置以降を大文字化する
?&Sl(cp)偽ならカーソル位置以降を小文字化する
#?カーソル行を再表示する

本来,カーソル位置の「1語」を大文字/小文字化するコマンドは#23だが,この拡張は次の点で有利だ。

拡張文字列関数の&Su()/&Sl()は,まさにこのような要求から装備されたものであり,新関数を活用した好例と言えるだろう。


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