テキストの二重化

作者: 上村 郁夫

【概要】
 同じテキスト内の別の箇所を画面分割して参照したいことがあります。VZ標準の[ESC][D](テキストの二重化)はそのためのマクロですが、ディスクの元ファイルを呼び出して分割表示しますので、大幅に修正が加えられたテキストでは役に立たないことがあります。また、参照テキストはView mode(見るだけで編集できない)でオープンしますので、もし参照テキスト側に修正したい箇所が見つかっても、編集することはできません。[CTRL]+[K][R]で解除して強引に編集できなくもありませんが、あくまでも別のテキストとしてオープンしていますから、意味がありません。
 DUP.DEFを使えば、ディスクの元ファイルではなく、編集中テキストを正確に二重化できますし、疑似的に参照テキストを編集できます。

【使用法】
 [ESC][D]を押してください。画面分割モードや、カーソルがどちらのテキストにあるかで動作が異なります。

 ● 全画面モード
[ESC][D]で、編集中テキストをコピーして二重化します。
[ESC][SHIFT]+[D]で、ディスクの元ファイルをオープンして二重化します。

 ● 二重化したテキストを画面分割している状態
カーソルが編集テキスト側にある場合、[ESC][D]で参照テキストをクローズします。 カーソルが参照テキスト側にある場合、[ESC][D]でテキストの配置を入れ替えて、それぞれ該当する行へジャンプします。見た目には、ステータスラインの色が入れ替わり、それまでView modeだった側が編集できるようになります。

 参照テキスト側にカーソルをおいて[ESC][D] を押すと……。


 テキストの配置が入れ替わり、対応する行へジャンプする

 テキスト番号が入れ替わっていることに注意してください。

 ※ VZ.DEFの「6 [ESC]D @D "D テキストの二重化"」と差し替えてください。
(「Vzマクロコレクション」所収)

download
======== dup.def by I.KAMIMURA ========
【拡張・テキストの二重化】

* M
6  [ESC]D @D "Duplicate"
        ?.
        (wn)??.                         ; console での実行を禁じる
        (wt)? >D                        ; 画面分割か?
        (wt==tc)? { &m(6). }            ; テキスト数チェック
        &s                              ; 画面出力の停止
        ro[, ro-,                       ; Viewモード保存
        &#Y(0) n=ln, y=ky,              ; 全画面モード。行番号、表示位置を記憶
        (ks&1)? {                       ; ◆ シフト実行か?
;       (ks&1)?? {                      ; ◇ シフト実行でないか?(反転)
                #R #P #m                ; ディスクの元ファイルをオープン
                (s)? { 'Y' >A }         ; 存在しないなら新規オープン
                >C
        }
        #N #P #m                        ; 同名ファイルを新規オープン
:A      #W #^ mb=0, #b #_               ; ファイル全体を範囲指定
        (ct)? { #> #m #x }              ; EOF 行対応
:B      (mb)? {
                #k #W #i                ; ブロックを複写(巨大ブロック対応)
                (ek)?? #B               ; ブロックの最後へ
                &m("Line:%d",ln)        ; 処理経過をメッセージ
                #W >B
        }
        &#J(n) ky=y, #W                 ; 元の位置へジャンプ
:C      mr=255,                         ; Viewモードにする
        &#J(n) ky=y, #W                 ; 対応する位置へジャンプ
        ro],                            ; 変数・Viewモード復帰
        &m("") &d #Y .                  ; 画面分割

;--- 画面分割の場合 ---

:D      (mr<=1)? >E                     ; 編集画面側か?
        &s &m(" wait ...")              ; 参照画面側ならテキスト入れ替え
        mp[, #M
        t=wn, ky[, #W o=wn, ky[,
        &01 &#T(t) &#J(n)               ; 対応する行にジャンプ
        #> #r (r)? #c #U &01 #U ky],    ; 対応する文字列を検索
        #W &#T(o) &#J(n)                ; 編集画面側でも同じ処理
        #> #r (r)? #c ky],
        mp], &m("") &d #] .

:E      #W (mr<=1)? { #W . }            ; 参照画面は Viewモードか?
        #C (wt)? { #W &#Y(0) }

1:      n=ln,
        #> mb=0, #b #< #G               ; 現在行を検索文字列に設定
        (mb)? { #s (r)?. >^ }           ; 空行なら前の行へ

*
======== End of dup.def ========

【作者コメント】
「Vzマクロ道場」や「Vzマクロ博物館(別館)」で紹介したESC_D.DEFのより完璧版です。