Vz Resources
Commands
2019-05-12T10:52:26+09:00

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

番号記号初期キー機能
#05#e^E [UP]↑(上方にカーソルを移動)

s==0(編集モード)

スクリーン上で1行上にカーソルを移動する。

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

ld(表示行)は変化するが,ln(論理行)は不変も有り得る。マクロで使用する場合に,確実に前の論理行に移動するには #< #s でないと無限ループの可能性がある。

ファイルの先頭表示行で実行されると,命令失敗でrに-1(通常は成功でrは0)を返す。ファイル先頭に向かっての処理では,戻り値を判定しないと無限ループに陥る可能性がある。

また,スイッチEn(カーソルを改行以降に表示しない)が無効(-:初期値)であれば,擬似的なカーソルとなって表示桁位置にぶれを生じない。このときの表示上の桁位置は,編集テキスト変数kx(保存された桁位置)に保持されている。

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

[入力文字列先頭一致で]ヒストリーを遡る。

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

[入力文字列先頭一致で]ヒストリーを遡る。

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

スクリーン上で1行上にカーソルを移動する。

FM(ファイラーのモード)+8(Rotate)が指定されていて,カーソルがファイラーの上端にある場合,上端から末尾にカーソルを移動する。ただし,FW(ディレクトリバッファの数)の値が少ないと,すべてのファイルを表示できないので注意が必要である。複窓ファイラーの場合は双方の合計がFWの値に納まることが必要だ。

s==4(メニュー)

メニュー上で1行上にカーソルを移動する。メニューにおけるコマンドキーの例外([UP][DOWN][CR])に当たり,他のコマンドキーがメニューをキャンセルするのに対して,意味のある特定の動作をする。

メニューの上端アイテムにカーソルがある場合は,メニューの末尾アイテムにカーソルを移動する。リードオンリーメニューや1アイテムメニューであっても,コマンドキーによる戻り値は得られない。

コマンドキーテーブルの書換

メニューにおいて,このコマンドの戻り値の取得を可能にする技術としては,コマンドキーテーブルの一時的書換というものがある。次のサンプルマクロはYushi氏の提示したものだ。

=T23=
* M
1""
        &Le(pr,vp+118) &Le(vp+118,vp+110) &Le(vp+110,pr)
:A      !01 (r+1)??>Z
        (r&$FF+$100)>!{
                (#s) (m"←")
                (#d) (m"→")
                (#a) (m"↑")
                (#f) (m"↓")
        } &m("%s",m)
        >A
:Z      &Le(vp+110,vp+118) &Le(vp+118,pr)

* P
1 "Test",10,1
        "Yushi"
*

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

無効

マクロによる拡張

このコマンドは各モード共通コマンドであるため,マクロによる拡張にあまり馴染まないが,ほとんど使われることのない歴史的ダイヤモンドカーソル^Eに特定の機能を持たせることは可能である。コマンドキー側のキーを削除しなければ,編集モード以外ではコマンドキーがマクロキーに優先するため,編集モードでのみ使うような機能がよいだろう。

例-1
ファイルの上端に到達してさらに上へとカーソルを進めようとすると,新たに空行を挿入する。フリーカーソルを欲張りにしたような動作になるだろう。
= free_up
* macro
5 ^E "" ?.
        #e (r)?{                ;ファイルの上端に達したら
                #< #n           ;1行挿入する
        }
*
参照: #<  #n
例-2
例-1を少し拡張させたもので,不要な空白は削除し,挿入する空白にはタブを使用しないというものである。
= free_up
* macro
5 ^E "" ?.
        #e (r)?{
                x=lx,                   ;カーソルの桁位置を記録
                ' ' #16                 ;行末空白を削除
                #< #n                   ;空行挿入
                Eu[+, &#V(x) Eu], #>    ;元カーソル位置まで空白を埋める
        }
*
参照: lx  #16  Eu  &#V()

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