Vz Editor
2005-11-28T21:04:34+09:00

コマンド拡張で学ぶVZマクロ入門 #12(#>)

番号記号初期キー機能
#12#>^QD ^[-->]論理行末

s==0(編集モード)

返り値 r: 常に0

論理行末にカーソルを移動します。また,行の編集中であれば,一旦ラインバッファからテキストバッファに書き戻しを行います。したがって,論理行末で実行したときは,カーソル位置に変化はありませんが,編集状態が編集フラグに反映されます。

Enが有効で論理行末以降に擬似カーソルがある状態で実行すると,カーソルを本来の位置である論理行末に復帰させます。&#68()&#V())で行末以降に空白文字を出力しようとするとき,実行時点のlx(編集画面上の桁位置)が参照されるため,カーソルが行末を越えて指定位置以降にあると空白文字が出力されません。(参照されるのはlxで,kx(保存された桁位置)ではありません。)このような誤動作を防止するために,#>を使用してカーソル位置を整えるということができます。

#<の直後の#>

論理行頭に向かって[BS]で削除を行い,論理行頭に達した時,#<(論理行頭への移動)コマンドを実行してもラインバッファから書き戻しを行いません。この状態で#>を実行した場合,同様に書き戻しが起こりません。

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

入力窓に入力されている文字列の終端にカーソルを移動します。入力窓の幅よりも表示されている文字列が長い場合は,横スクロールが発生します。

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

コマンドラインに入力されている文字列の終端にカーソルを移動します。文字列が長い場合は,スクロールが発生します。

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

無効

s==4(メニュー)

メニューを閉じてコマンドに応じた値を返します。(下位7ビットが0Ch)

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

無効

マクロによる拡張

#>の拡張に関しては,個人的な思い入れが非常に強く,同時に懐かしい思い出がよみがえります。思えば,これがコマンド拡張マクロを意識するようになるきっかけとなったのでしょう。

例-1

12 ^[-->] ""
        ?.
        x=lx, #? (x>lx)?. (ct<2) #> ??. &s
:A      #s (ct==2)?>A #d &d

元はワードプロセッサ一太郎の^Oの動作を模したもので,nifty:FGALPK/MES/14/02878(1993-11-22T08:42:00+9:00)でのコードは以下のようでした。うわ,無駄に長い。

89 ^\ "文字末"
        ?. &s #> #s
        (ct==2) ? { #> #a #d >A } ? { #> >E }
:A      (ct==2) ?? { #d >A } >E
:E      &d .

こんな何でもないようなマクロですが,榊原版VZの作成者である榊原知氏に「うんうん、 標準の ^[-->]^QD の代りに入れておくと便利そうですね。」とお声がけをいただき,添削してもらって妙に嬉しかったのを懐かしく思い出します。そう言われるまで別のキーに割り当てていたのですから,知恵が足りないにも程があるというものですが…。

その後,行末以降に擬似的にカーソルがある場合の動作を調整して今に至ります。

榊原氏は当時,nifty:FGALPK/MES/14 『マクロ作るぞ』会議室のボードリーダーで,同アーティクルで次のように述べています。

nifty:FGALPK/MES/14/02886 (1993-11-23T17:48:00+9:00) 榊原知

でも、マクロは中身よりも仕様が大切だから、こういうシンプルで便利なマクロを考えられるというのはいいことだと思いますよ。中身は少々下手でも実用になりますけれど、仕様を思いつかなかったらそもそもそのマクロが存在しないですし。

マクロ道における至言だと思います。

例-2

シフト実行すると表示行末へ移動し,通常実行で論理行末へ移動する。

12 ^[-->] ""    ;Tail[\]
        ?. (ks&1)?>>
        x=lx, #? (x>lx)?. (ct<2) #> ??. &s
:A      #s (ct==2)?>A #d &d     ;H_ear
12 ^Q] [END]  "" ?. &s ly[, kx-, #x (r) ? #> ? #s ky], &d #]    ;T.Tanomura

#11(#<)解説の節で例示している構成と対にしたものです。

VZの表示行末への移動機能はマクロで実装されていますが,その内容は次の通りです。

        ?. &x(we-2) #?

表示桁数の2バイト左にカーソルを移動して,(行末よりも右側だったときのために)カーソル位置を適正化するというものです。この2バイト左となる理由は,2バイト文字が中途半端に行末にかかって次行へ送られる場合に,1バイト左としてあると2バイト文字と一緒に次行へ送られてしまって,行末への移動とならないからです。その副作用で,1バイト文字が行末にある場合は,行末の1バイト手前にカーソルが移動します。

これは,ある意味,非常に気持ちの悪いことで,多くのマクロ師たちが代替するマクロを作成しました。ここで引用するかたちで例示しているT.Tanomura氏のマクロは,それらの代替マクロの集大成と言ってもよいものです。テキストエディタに慣れた人の感性が伝わってくる見本のようなマクロですね。

このマクロを直後に配置し,通常の実行では論理行末への移動,シフト実行で表示行末への移動をさせるということになります。

NEC-98では,表示行末へ移動するマクロのキーが@[-->]に割り当てられていたせいもあって,IBM-PCを使い始めた頃は表示行末に移動しようとするときでも,つい[-->]に手が伸びてしまっていたので,このような設定にしました。論理と表示の桁位置が同じになる行頭と異なり,論理行末が表示行末と一致することは少ないので,行頭移動マクロよりもよく使いました。現在では自然に[END]に手が伸びるようになりましたが,この記述だけは残っています。

一応,T.Tanomura氏のマクロについて解説を加えておきましょう。

        ?. &s   ;サイレントにする(このマクロではky+&dとの関係で必然)
        ly[,    ;カーソルのY位置を保存(復帰はkyへ)
        kx-,    ;カーソルのX位置を強制的に表示行頭にする
        #x      ;下へ移動する時点でカーソル位置は行頭にある
        (r)?    ;#xの返り値が0以外なら,つまりファイルの末尾で移動失敗なら
        #>      ;論理行末へ移動する
        ? #s    ;#xの返り値が0なら1字左へ,結果的に前の表示行末
        ky],    ;カーソルのY位置を復帰する(スクロールが発生していても可)
        &d #]   ;kyに値を代入したら&dで画面を再表示する(#]でステータス再表示)

次行頭から1文字戻るというのは誰でも考えるかもしれませんが,美しい動作をさせるために過不足なくフォローしている点が白眉と称される由縁でしょう。

T.Tanomura氏は常用小物の作成に長けていて,TToolsという小品集を発表されていますが,その作品のいずれもが美しい動作をすることでVZ史に名を残した人と言えるでしょう。


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