番号 | 記号 | 初期キー | 機能 |
---|---|---|---|
#19 | #l | ^QY ^[DEL] | 行末まで削除 |
カーソル位置の右側(カーソル位置の文字を含む)を論理行末まで削除する。削除された文字列は削除バッファに格納され,コマンド#20(#u)でカーソル位置に復活出力できる。復活時のカーソル位置は不変。
戻り値r:常に0
削除バッファ(先頭:pu-bc/削除文字列終端:mg..-3/格納可能サイズ:Bc)への格納時,サイズ情報(2バイト:(mg..-3)..-1)の先頭1ビットが立つ。
編集モードと同じ
編集モードと同じ
無効
無効
削除バッファは普通に使えば単なるゴミ箱であるが,#20/#u(削除文字列復活)を活用することにより,スタックバッファのように扱うこともできる便利な函にもなる。次の例(m.gann師による拡張)は,さらに一歩進めて削除バッファにコピーを積むという手法である。削除バッファに積んだ文字列は,テキストスタックからのペーストができない1行入力窓やコマンドラインでも出力できるところが有利な点と言える。
19 ^[DEL] "" ?. (ks&1)?{ ;シフト起動なら &s ;サイレント #] ;テキスト修正フラグ更新 mr[-, ;ビューモード対応のため修正フラグ保存・操作 #l ;行末まで削除 #54 ;編集行を元に戻す mr], ;修正フラグを復帰 #?. ;再表示して終了 } #l ;通常起動は単一コマンドのみ実行
上記のようにスタックの如く使う場合は,出力後のカーソル位置が出力文字列の末尾に移動していると便利な場合が多い。そこでさらに拡張を試みたのが次の例である。
19 ^[DEL] "" ;Del -> (41) ;[\] Copy, view too / csr ptr
(ks&1)?{ &s #] mr[-, ;pk14#11003 m.gann
#l #54 mr], #? ;#] mr[-, #l mr], #54
(((mg..-3).-1)^=$80, ;H_ear cursor ->$
. }
#l
(mg..-3).-1 は削除バッファ終端の一歩手前,つまり最後に削除した文字列のサイズ情報の上位バイトである。サイズ情報の最上位ビットは出力後のカーソル位置を制御するフラグとなっており,#19/#lではフラグは立っていないものを強制的にフラグを立てることで,#20/#uで復活出力後のカーソル位置を更新してしまおうというわけだ。
このほかの拡張例として,やはりm.gann師のmgann.defに収録されているものだが,通常実行で起動された場合の玄人向けコードを紹介しておこう。
(mb*kx[!&&mr-$80) #l ?#g kx],
理解が追い付かないまま解説するのも苦しいが,次のような振る舞いらしい。
(mb*kx[! ;行ブロックでカーソルが行頭にあれば
&& ;かつビューモード以外なら
mr-$80) ;(ビューモードでは何度も編集コマンドを使わせないため)
#l ;条件式の評価に関わらずコマンドは常に実行される
?#g ;条件式が真なら改行も削除してカーソル行を完全削除
kx], ;カーソルは常に行頭に戻す
どういう機能を実現するものか想像するのはなかなか楽しい。おそらく,複写の目的で行ブロックしながらカーソルを下に移動する途中に不要な行があったら,その不要な行を削除しつつブロック指定を継続できるというものだろう。さすがはm.gann師,小憎らしいほど便利なマクロである。