ワンタッチ/リードオンリセーブ、連番セーブ

作者: 上村 郁夫

NIFTYの会議室に書き込んだマクロです。

download
======== safe.def ======== by I.Kamimura

【ワンタッチ/リードオンリセーブ、連番セーブ】

■動作環境

 ● VZ Editor Ver 1.6 以降

■簡易ヘルプ

 ●〔ESC〕〔S〕でワンタッチセーブ(リターンキー自動化)
 ●〔ESC〕〔SHIFT〕+〔S〕(または〔GRPH〕+〔S〕)で連番セーブ
   「.000」「.001」などユニークな拡張子となる。 環境変数 VZBAK が設定さ
  れていると、そのディレクトリにセーブする。
 ●ブロックモードでは基本機能のまま
 ●MS-DOS  レベルのリードオンリ属性のファイルを修正してセーブしようとす
    ると、 「ディスク上ではリードオンリ属性です.更新しますか?(Y/N)」と
    問い合わせる。セーブ後はまたリードオンリ属性に戻す。

■カスタマイズ

 このファイル上で GUEST.DEF (YMFCST.DEF 下位互換カスタマイザ)を起動す
ると、対話式でカスタマイズできます。
------------------------------------------------------------------------------
#AUTO_RET       +       ;連番セーブでもリターンキーを自動化する
------------------------------------------------------------------------------


* M
80 [ESC]S "ワンタッチ/リードオンリセーブ"
        ?.
        (mr&$80)? { &m(36). }           ; 「変更できません」
        (mb)? { #S. }                   ; ブロックモードなら基本機能のまま
        (ks&1)? >81                     ; シフト実行なら連番セーブ
        ax=$4300, cx-, &>               ; ファイル属性を調べる
        (cx&1)? {                       ; リードオンリか?
                &a("ディスク上ではリードオンリ属性です.更新します") (r-1)?.
                ax=$4301, cx[-, &> cx], ; リード/ライト可能に変更
        }
        #S #m                           ; セーブ
        (cx&1)? {
                ax=$4301, &>            ; リードオンリに戻す
                &m("更新後リードオンリ属性に戻しました")
        }

0:      dx=wa+$92, &i($21)              ; wa+$92 : 編集中テキスト名

81 @S   "連番セーブ"
        ?.
        &Sh(pw,wa+$92) m=mr,            ; 元のファイル名 --> pw
        &b(3) #S n-,                    ; 元のファイル名 --> pr
        &Se(pa,"VZBAK")                 ; 環境変数 VZBAK を pa に取得
        (r)?? {                         ; 未設定なら同一ディレクトリ
                &Sy(pr) &Sc(pa,pr,bx-pr-1)
        }
        (r.-1=='\')? r.-1-,             ; ディレクトリ名の末尾の'\'を除去
        dx=pa, ax=$3900, &i($21)        ; ディレクトリ作成
        &Sy(pr) &Sa(pa,bx-1)            ; '\filename.ext' --> pa
:A      &Sy(pa) (r&2)?? cx=si,
        &Sp(cx,".%03d",n)               ; 拡張子を連番にする
        #x &?("%s",dx=pa)
        ax=$4E00, cx=$FF, &i($21)       ; すべての属性を検索
        (r)?? { n++, >A }               ; すでに存在するなら次の番号
;       &l                              ;#AUTO_RET- [CR]/[ESC] を待つ
        #m                              ;#AUTO_RET+ 
        (r)?.
        #82 #x &?("%s",pw) #m           ; 元のファイル名に戻す
        mr=m, #]                        ; 修正フラグを元に戻す
        &m("$"%s$"に連番セーブしました",pa).

*
======== End of safe.def ========



(1995/09/21 FGALPK MES 13 #02581にて)


【作者コメント】
ロジックがちがうマクロがハードディスクのこやしになっていました。連番セーブでは、「カウントアップしながらファイル名検索し、存在しなければリネームする」のと「いきなりリネームをかまして、失敗したらカウントアップしてトライし続ける」のと、どちらがよいのでしょう。
download
======== safe.def ======== by I.Kamimura

【ワンタッチ/リードオンリセーブ、連番セーブ】

■動作環境

 ● VZ Editor Ver 1.6 以降

■簡易ヘルプ

 ●〔ESC〕〔S〕でワンタッチセーブ(リターンキー自動化)
 ●〔ESC〕〔SHIFT〕+〔S〕(または〔GRPH〕+〔S〕)で連番セーブ
   「.000」「.001」などユニークな拡張子となる。 環境変数 VZBAK が設定さ
  れていると、そのディレクトリにセーブする。
 ●ブロックモードでは基本機能のまま
 ●MS-DOS  レベルのリードオンリ属性のファイルを修正してセーブしようとす
    ると、 「ディスク上ではリードオンリ属性です.更新しますか?(Y/N)」と
    問い合わせる。セーブ後はまたリードオンリ属性に戻す。

■カスタマイズ

 このファイル上で GUEST.DEF (YMFCST.DEF 下位互換カスタマイザ)を起動す
ると、対話式でカスタマイズできます。
------------------------------------------------------------------------------
#AUTO_RET       +       ;連番セーブでもリターンキーを自動化する
------------------------------------------------------------------------------


* M
80 [ESC]S "ワンタッチ/リードオンリセーブ"
        ?.
        (mr&$80)? { &m(36). }           ; 「変更できません」
        (mb)? { #S. }                   ; ブロックモードなら基本機能のまま
        (ks&1||eb)? >81                 ; シフト実行なら連番セーブ
        ax=$4300, cx-, &>               ; ファイル属性を調べる
        (cx&1)? {                       ; リードオンリか?
                &a("ディスク上ではリードオンリ属性です.更新します") (r-1)?.
                ax=$4301, cx[-, &> cx], ; リード/ライト可能に変更
        }
        #S #m                           ; セーブ
        (cx&1)? {
                ax=$4301, &>            ; リードオンリに戻す
                &m("更新後リードオンリ属性に戻しました")
        }

0:      dx=wa+$92, &i($21)              ; wa+$92 : 編集中テキスト名

81 @S   "連番セーブ"
        ?.
        (mr&$80)? { &m(36). }           ; 「変更できません」
        (mb)? { #S. }                   ; ブロックモードなら基本機能のまま
        p=wa+$92,                       ; 編集テキスト名
        &Se(pr,"VZBAK")                 ; 環境変数 VZBAK を pr に取得
        (r)?? {                         ; 未設定なら同一ディレクトリ
                &Sy(p) &Sc(pr,p,bx-p-1)
        }
        (r.-1!='\')? r..0='\',          ; ディレクトリ名の末尾の'\'を除去
        &Sy(p) &Sa(dx=pr,bx)
        ax=$4E00, cx=$FF, &i($21)       ; ディスク上にオリジナルが存在するか
        n=-1,
        (r)?? {
:A      &Sy(di=pr) (r&2)?? cx=si,
        &Sp(cx,".%03d",n++)             ; 拡張子を連番にする
        dx=p, ax=$5600, &i($21)
        (ax==5)? >A                     ; すでにあるなら番号アップ
        &Sh(pf,pr)                      ; バックアップ名をファイル名ヒストリへ
        }
        #S #m
        (n<0)?.                         ; ディスク上にオリジナルがない
        &m("$"%s$"にバックアップしました",pf)

*
======== End of safe.def ========



(1995/12/17 22:01のタイムスタンプ)