Vz Editor
2018-09-09T18:56:26+09:00

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

番号記号初期キー機能
#06#x^X [DOWN]↓:下の表示行に移動

s==0(編集モード)

戻り値 r: 0=移動成功,-1=ファイルの最終表示行/EOF行で移動失敗

weよりも長い論理行では,カーソルの移動によってld(表示行)は変化するが,ln(論理行)は不変も有り得る。確実に次の論理行に移動するには #> #d とする。ファイル末尾では命令失敗でrに-1(通常は成功で0)を返す。

マクロでファイル末尾に向かっての処理では,戻り値を判定しないと無限ループに陥る可能性がある。ct==0([EOF]で真)の判定もよく利用されるが,意外な落とし穴があるので注意が必要だ。

[EOF]だけの行でない場合(文字列の直後が[EOF]でファイルの終端に改行コードがない),カーソル位置によっては無限ループに陥る可能性がある。また,改行コードがあっても,それが \r(0Dh)の場合は,見掛け上は[EOF]のように見えていながらVZ側は \r(0Dh)と認識するので,本当に訳がわからないということもある。通常このようなファイルは意識的に作ろうと思っても,[EOF]上で &o(13) を実行するなどの操作が必要で,なかなかできるわけではないが,壊れたファイルを開いたり,通常ありえない置換処理を行ったときに作成される可能性があるので,ctの評価による[EOF]の判定は確実ではない。

行番号を付けるつもり(長い行があると無限ループ)


 :a     #x #<                   ;次の表示行頭が
        (ct==0)?.               ;次の論理行とは限らない
        &?("%5u: ",ln)
        >a

その対策のつもりが不完全な場合もある


 :a     #> #d                   ;確かに次の論理行頭だが
        (ct==0)?.               ;ファイル末尾が\rではct==1
        &?("%5u: ",ln)
        >a

次の例は改行1個と \r (0D0Ah)だけのファイルをダンプしたところである。オプションEz([EOF]コード1Ahの出力)が有効でも無効でも,末尾に \r があると[EOF]のctは1になる。このようなファイルではctの評価によるファイル末の判定はできない。

C:\>debug c:\0d(eof)1.txt
-d100
7408:0100  0D 0A 0D 00 00 00 00 00-00 00 00 00 00 00 00 00
-q
C:\>debug a:\0d(eof)2.txt
-d100
7410:0100  0D 0A 0D 1A 00 00 00 00-00 00 00 00 00 00 00 00
-q

ここまでチェックすれば無限ループにはならない


 :a     #> #d                   ;次の論理行頭か[EOF]上で
        (ct==0 || r==-1)?.      ;ctだけでなく#dの戻り値も評価する
        &?("%5u: ",ln)
        >a

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

= Sample1 =
入力窓を作業用にして削除文字列を加工する
*m
1 ^\ "" ?.
        (mr==$80)?#67
        #> "aaa" (3){ #s } #l
        ps[=pa,
        #61             ;ここで初期文字列(最新の履歴)が出ている
        #x              ;#xで初期文字列をクリアする必要がある
        #u #23 #m
        ps],
*

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

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

s==4(メニュー)

このコマンドは,メニューにおけるコマンドキーの例外にあたる。通常メニュー表示中にコマンドキーを押すと,メニューを閉じて値を返しますが,このコマンドはメニューカーソルの移動に用いられているので,メニューでの特殊キー押下時の分岐に必要なメニュー終了時の戻り値は期待できない。(可能にする裏技もある。→コマンドテーブルの書換)

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

無効

マクロによる拡張

基本的なコマンドであるため提示しない。


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