Vz Editor
2005-11-14T21:07:36+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.