Vz Resources
Commands
2018-09-09T22:54:38+09:00

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

番号記号初期キー機能
#16^QH \[BS]語の先頭まで削除

s==0(編集モード)

カーソルの前の文字から欧文単語の先頭まで削除する。単語としてみなされる範囲は同じ文字種(ct)が連続する範囲で,和文あるいは和欧混在する場合も,この規則にしたがっている。記号類はct==3だが,'_'と'$'は例外的に英数字と同じct==6になっていることに注意してほしい。

削除バッファは一種の「スタック」である。削除された文字列は一定の大きさをもつバッファの範囲で「積まれ」ていき,空きがなくなると古い文字列は押し出されて捨てられてしまう。スタックのイメージは次の図のようになる。(上位アドレスを上に書くのが普通だが,右に向かって書いている。)aやbは1バイトの文字,01や 80は十六進数である。

 |←─────── 削除バッファ (サイズはbc)────────→|
─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─────────────┬──
  │a│01│80│b│01│80│c│01│80│                          │
─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─────────────┴──
  ↑削除バッファの先頭            ↑削除文字列終端 mg..-3   ↑puの先頭
  pq..131 (pu-bc)

削除バッファはスタックセグメント内にあり,pq..131のポインタが指すアドレスにある。マクロバッファの先(上位アドレス)に各種ヒストリーバッファ,システムメニューバッファがあり,その先にある。pu(マクロ用配列領域)の手前にあるので,削除バッファのサイズであるbcpuから引くpu-bcという式でも先頭アドレスを算出することができる。削除文字列の終端はmg..-3のポインタが指すアドレスで,新たに削除された文字列はこの位置から追加されてゆく。

削除した文字の上位2バイトはサイズ情報を示す数値である。ただし2バイトをまるまるサイズ情報として使っているわけではなく,サイズ情報の構造をビット単位で示すと,次の図のようになっている。

   ←上位ビット                   下位ビット→  
  ┏━┯━┯━┯━┯━┯━┯━┯━┳━┯━┯━┯━┯━┯━┯━┯━┓
  ┃★│      上位バイト          ┃          下位バイト          ┃
  ┗━┷━┷━┷━┷━┷━┷━┷━┻━┷━┷━┷━┷━┷━┷━┷━┛

★で示した最上位の1ビットが,削除方向を示している。

つまり,サイズ情報は15ビットで表わせる(7FFFh==32767)文字分が確保してある。サイズ情報としては十分で,むしろ過多なくらいである。

次の図は abc という文字列を#16でまとめて削除した例だ。

─┬─┬─┬─┬─┬─┬────────────
  │a│b│c│03│00│
─┴─┴─┴─┴─┴─┴────────────

文字列が連続しており,サイズ情報も3バイトを示している。

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

編集モードと同じ

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

編集モードと同じ

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

無効

s==4(メニュー)

戻り値rの内容

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

無効

マクロによる拡張

コマンドそのものの拡張ではないが,このコマンドは行末のスペースを除去するという用途によく使用される。

行末に空白類が存在するか否かを判断するには,通常は次の例のようにカーソルを往復させる必要がある。

    #> #s (ct==2)?{ #d #16 }?{ #d }

多少工夫してもカーソルの往復とカーソル位置の文字種の評価が必要だ。

    #> #s (ct==2) #d ? #16

ところが次のようにすることで,カーソルの往復とカーソル位置の文字種の評価がともに不要になるのだ。

    #> ' ' #16

このように行末に空白をひとつ補充して#16を実行すると,空白があろうとなかろうと同じ処理で済んでしまうのである。こういった発想はいかにもエディタのマクロらしいと言えるだろう。


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