カーソル行の複写

作者: 上村 郁夫


 [CTRL]+[K][D](カーソル行の複写)は、VZのマニュアルでは「カーソル行を次の行にコピーしたい場合に便利です」と簡単に片づけてありますが、なかなかどうして、味わい深いマクロです。
●実行前(通常行)
字境界のブロックだよん
 ※はカーソル位置をあらわします。

●[CTRL]+[K][D]で二重化
字境界のブロックだよん
文字境界のブロックだよん

 文字境界または行境界のブロックの状態で実行すると、その範囲を二重化します。

●実行前(文字境界のブロック)
文字境界のブロックだよん_

●[CTRL]+[K][D]で二重化
文字境界のブロックだよん字境界のブロックだよん


 さて、ブロックの「二重化」まではよいのですが、「三重化」するつもりでさらに[CTRL]+[K][D]を押すと、通常行の二重化となってしまいます。
●三重化しようとしたら……
文字境界のブロックだよん字境界のブロックだよん
文字境界のブロックだよん文字境界のブロックだよん
 VZ標準の[CTRL]+[K][D]は「三重化」を想定していないのです。いや、そもそも「ブロックの二重化」を想定していないのかもしれません。

 dupline.defを使えば、ブロックの三重化だろうが四重化だろうが可能となります。

●dupline.defで三重化に成功
文字境界のブロックだよん字境界のブロックだよん文字境界のブロックだよん
 まるで[CTRL]+[K][C](行・ブロック複写)を連続実行しているように見えるでしょう。でも、実際に[CTRL]+[K][C]を押してみればわかりますが、テキストスタックの先頭にはこの文字列はありません。また、一度でも[CTRL]+[K][D]以外の操作(たとえばカーソルを右に1個移動)をすると、「通常行の二重化」となります。
 DUPLINE.DEFは、ユーザーが[CTRL]+[K][D]を連続して押しているあいだは無限に多重化をおこない、ユーザーが多重化をやめたとみるや「通常行の二重化」に戻る、賢いマクロなのです。

(「Vzマクロコレクション2」所収)

download
======== dupline.def ======== by I.Kamimura
* M
89 ^KD  "カーソル行の複写"
        ?. (cm==48||cm==50)? mb=r, #k #i
;*
;======== End of dupline.def ========

【作者コメント】
(cm==50) は、直前にユーザが文字列のコピー([CTRL]+[K][C])をおこなった場合に対応するため……だったけ。