Vz Resources
Commands
2018-10-07T21:05:28+09:00

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

番号記号初期キー機能
#49#k^KK \[F08]行/ブロック複写

【注】IBM-PC用VZIBMJ.DEFには@[DEL]のシフト起動で#49を実行するマクロが初期導入されている。

s==0(編集モード)

行/ブロック複写

戻り値 r:常に0(ブロックが大きすぎる場合も含む)

行複写の範囲は,行内のカーソル位置にかかわらず,論理行頭から改行コードを含む論理行末までになる。

関係するオプションと動作

複写された行/ブロックはテキストスタックに保存される。ステータスラインにシステム情報を表示するオプション(Ds)を有効にした環境では,(括弧)内にテキストスタックの使用状況が表示される。

テキストスタックに格納しきれない大きさのブロックを記憶しようとした場合は,先頭から格納できる部分のみ複写され,残りの部分はブロック選択された状態のままで残される。このとき「ブロックが大きすぎます」という警告がメッセージラインに表示される。残ったブロックを複写しようとすると,直前の複写によりテキストスタックに格納した部分は押し出されて消滅してしまうため,ブロック指定を解除するか,一旦別のファイルに複写した部分を出力する必要がある。このような事例では巨大ブロックを扱えるマクロ,例えば上村郁夫氏の巨大ブロック対応・自動コピー BIGBLOCK.DEF v1.00などを利用することが推奨される。

テキストスタックフル時の警告オプション(Ex)を有効(+)にすると,大きなブロックを複写する際にテキストスタックに格納されている文字列を押し出してしまいそうなときは,「テキストスタックを消去しますか? (Y/N)」の警告を表示する。これに'y'で応答するとテキストスタックの内容を削除(押し出す)してブロックを複写し,'n'で否とすると複写コマンドの実行を中止する。

その他のオプションとして,DOSコマンドの実行前にテキストスタックをクリアするスイッチSkがある。

意図してテキストスタックをクリアしたい場合は,コマンド関数&#51(p)を使用する。

大きなブロックを複写する場合は,カーソルをテキストの先頭に近い側に置くと,より高速に複写が行える。この理由は,ブロック指定の向き(xcで確認可能)に関わらずブロックの先頭から順に処理されるため,処理の都度カーソルをブロック範囲の先頭にジャンプしなければならないからだ。テキストの末尾に向かって大きなブロック指定したときは,#B(ブロックマークとカーソル位置の交換)でカーソル位置を変更しておくとよい。

なお,マクロ実行中にサイレントモードで行単位(mb==0)の複写を繰り返すと,テキストスタックの内容が損傷するバグが報告されている。非サイレントモードであれば問題ないが,動作が丸見えでは支障があるというときは,#< #b #> #d #y のように改行を含む文字ブロックを複写するなどの工夫をすればよい。

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

無効

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

無効

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

無効

s==4(メニュー)

戻り値rの内容

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

無効

マクロによる拡張

#48(#i)/#50(#p)などのように,テキストスタックから出力するタイプのコマンドと違い,テキストスタックに保存するコマンドである#49(#k)を拡張するとしたら,自動複写を実現するためのフロント部である自動ブロックであろうか。コマンドそのものを拡張することはなかなか考えにくいところだ。もしくは保存後にブロックの種別(行/ブロック)を変更するというところか。


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