クローズ・オープン

作者: 上村 郁夫

 [ESC][L](クローズ・オープン)の知る人ぞ知る不具合……。クローズしたファイルとオープンしたファイルが同じ場合、《〜はオープンされています》とメッセージが出ますね。いちおう重複オープンのチェックはなされているわけです。ところが、同名ファイルが裏テキストとなっている場合は、このチェックをすり抜けて、同じファイルが2つオープンしてしまいます。
    ┌──────────┐                ┌──────────┐
    │裏        *ALICE.TXT│                │裏        *ALICE.TXT│
    ├──────────┤                ├──────────┤
┌─┴────────┐  │            ┌─┴────────┐  │
│表         QUEEN.TXT│  │ [ESC][L]   │表         ALICE.TXT│  │
├──────────┤ ──────→ ├──────────┤  │
│                    │  │            │                    │  │
│                    ├─┘            │                    ├─┘
│                    │                │                    │
└──────────┘                └──────────┘

 【編集テキスト】メニューをみると……。

        ┌─【編集テキスト】───────┐
        │1  WONDER.TXT              13357│
        │2 *ALICE.TXT                2757│
        │3  ALICE.TXT                2592│
        └────────────────┘
 重複に気づかずに両方のテキストを編集すると、わけがわからなくなります。
 LOAD.DEFなら、裏テキストのみならず、オープン済みの全テキストに対して重複をチェックします。同名ファイルをオープンしようとすると、《〜はオープンされています》とメッセージを出して、もともとオープンしていたテキストに切り替えます。

●必ずクローズ
 VZ標準の[ESC][L]を途中でやめると、クローズしようとしたテキストはオープンしたままになっています。LOAD.DEFでは必ずクローズします。

●必ずファイラー
 VZ標準の[ESC][L]ではそのときの状況によって、【入力ファイル】の1行ウィンドウが出たり、ファイラーが起動したりします。LOAD.DEFでは必ずファイラーが起動します。

●ファイル名に応じたディレクトリでファイラー起動
 VZ標準の[ESC][L]では起動するディレクトリは直前に参照したディレクトリに固定されています。LOAD.DEFではクローズしたファイルと同じディレクトリで起動します。

 これらの余計なお世話(?)がいらないときには、[ESC][SHIFT]+[L]を押してください。VZ標準のクローズ・オープンの動作となります。ただし、その場合も厳密な重複チェックはおこなわれます。
(イラスト)  鏡の国のアリス。  暖炉のうえの鏡をのぞきこんでいる。

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

download
======== load.def ======== by I.Kamimura
* M
89 [ESC]L "クローズ・オープン"
        ?.
        (ks&1)? { #L >A }               ; シフト実行なら通常の Load
        &Sy(a=wa+$92)                   ; 編集中ファイル名を解析
        (a+3-bx)? bx--, r=bx.0, r[,     ; r = ヌル化前の文字
        bx.0-, &Sh(pf,a)                ; pf にディレクトリ名をコピー
        r], bx.0=r,                     ; 書き戻す
        sq[-, sr[-, #C                  ; sr-, で pf を保護してクローズ
:L      (s==4)? { &c >L } sr], sq],     ; (s==4)? &c をより完璧に
        (s)?? #O                        ; 編集モードか?
        (s==3)? #P                      ;【パス・マスク】
        &Sx(fl+34,pf) (r)? #e #m        ; 同一ディレクトリでファイラー起動
:A      &Cr                             ; 編集モードに戻るまでキー入力
        c=wc+1,                         ; 最終テキスト番号から逆順にチェック
:B      (c--)??.                        ; console なら終了
        a=wo, (c){ a=a..0, }            ; テキスト番号 c の管理ワーク
        (a.3==1)? >B                    ; 修正フラグONならスキップ
        b=wo,                           ; console のテキスト管理ワーク
:C      b=b..0,                         ; 次のテキスト管理ワーク
        (a.2==b.2)? >B                  ; 同一テキスト番号ならスキップ
        &Sx(a+$92,b+$92) (r)? >C        ; ファイル名を比較
        &s &#T(a.2) #C                  ; 同一ならクローズ
        &#T(b.2) &d &m(27) >B           ;「〜はオープンされています」
;*
;======== End of load.def ========