Vz Resources
Commands
2018-09-09T21:29:52+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(メニュー)

戻り値rの内容

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.