Vz Editor
2007-04-23T16:28:30+09:00

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

番号記号初期キー機能
#28--未定義

s==0(編集モード)

未定義コマンド。ラインバッファに入る機能だけがある。

カーソル行をラインバッファに入れるという働きは,#04〜#28 に共通した機能である。#04〜#25は行編集機能があるコマンドだが,#26〜#28 は副作用のないダミーコマンドと言える。cpがラインバッファの中を指すようになるので,メモリ上でcpをポインタとして使用し,行内の離れた位置にある文字・文字列を直接操作できるようになる。

ビューモード(mr==$80)では使用できないが,再表示せずにカーソルをラインバッファに入れるので,再表示を伴うがビューモードでも有効な#29(#?)との使い分けをする。

コマンドサイレントモードビューモード
#28変更しない無効
#29(#?)オフにして再表示有効

戻り値 r:0=行編集開始, -1=ラインバッファがいっぱい

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

編集モードと同じ

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

編集モードと同じ

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

無効

s==4(メニュー)

→メニューの戻り値に関する説明

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

無効

マクロでの利用例

キーが与えられていないダミーコマンドであるため,拡張ではなく利用例を示す。

28 ^\   ""      ;cord ++/\--    ;Emmett
        ?. #28 &Jk(cp.) cp.r+=1-ks&1*2, #?

Emmett氏の見事な一行野郎である。解説を加えておこう。

?.編集モード以外では実行しない
#28ラインバッファに入る cpがラインバッファのオフセットを示すようになる
&Jk(cp.)&Jk(cp.0)と等価 カーソル位置の1バイトが漢字(2バイト文字)の1バイト目かどうか判定している 戻り値rが1なら漢字(2バイト文字) r==0なら英数字(ASCII)
cp.r+=1-ks&1*2,左辺は値を操作する相対アドレス ASCIIならcp.0 漢字ならcp.1になる 漢字コード2バイト目を増減するとコード順どおりに変更できる 2バイトをセットで値として扱うと下位バイトの1バイト目を加減することになるのでコード順どおりにならない 右辺は通常1(1-0*2)になり左辺の値をインクリメントすることになる シフト実行すると右辺は-1(1-1*2)になり左辺の値をデクリメントすることになる
#?再表示する cpをいじったら#29(#?)で再表示する 理由は&dよりも速度で有利だからだ

説明ならこれで済んでしまうが,この考え抜かれたコードの見事さはどうだろう。特別に難解なコードというわけではないが,組立てが絶妙で無駄がない。しかも足りないものもない。完璧といってよい小物の見本のようなマクロだ。


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