Vz Resources
Commands
2018-10-28T21:05:28+09:00

コマンド拡張で学ぶVZマクロ入門 #71(#R)

番号記号初期キー機能
#71#R[ESC]R @Rリードオンリーモードでファイルをオープン

s==0(編集モード)

リードオンリーモードでファイルをオープンする。

戻り値 r: 0: 正常終了(ファイルをオープン);  1以上: 既存のファイル(テキスト番号);  -1: キャンセル(オープンできなかった)

このコマンドでファイルをオープンしたときの動作は次の通り。

テキスト編集フラグ mr の値は $ff(255) の状態でオープンする。テキストの編集は可能で,変更後の mr の値は $fe(254) を示す。リードオンリーモードから通常の編集モードに #67 コマンド等で移行したときは,修正フラグを引き継いで値の反転(mr=mr^$ff の実行)により mr の値は 0(修正なし)または1(修正あり)を示すようになる。

同一パスのファイルが既にオープンされていても警告しないので,同じファイルを複数オープンすることが可能であり,製品版VZ.DEF(サンプル)に初期導入されている「テキストの二重化」マクロは #71(#R) を使用する一例である。(編集バッファを共有しないので,純粋な二重化とは言えないという側面は否定できない。)

RO (リードオンリーモード)の設定よりも優先する。つまり,RO が有効でもビューモード(mr==$80)ではなくリードオンリーモード(mr==$ff)でオープンする。オープン後に mr=$80 を実行すればビューモードに変更することは可能である。

なお,ファイルのオープン後に !Open イベントマクロが実行されることと,ファイル名ヒストリバッファの pf を使用することは,通常のオープンコマンド #70(#O) と同様である。

その他,#71(#R)を利用する場面としては,編集ファイルをそれなりに書き換えたという状態で,例えば不適切な正規表現を実行してしまったり,テンポラリファイルエラーなどが発生したとして,書き換えた部分を一部でも生かしたいというとき,当コマンドで編集前のファイルをオープンして #69 コマンドにより逐一比較を実行しながら確認するということも可能だろう。

s==1(文字列入力モード)

無効

s==2(コマンドラインモード)

無効

s==3(ファイラーモード)

#71(#R)は無効だが,同じシンボルの #R はファイラー専用コマンドの「リネーム(rename)」にアサインされており,ファイラーのファイルメニュー(VZFL.defのシステムメニュー13番)に使用法のサンプルがある。

s==4(メニュー)

戻り値rの内容

s==4(1文字入力モード)

無効

マクロでの利用

当コマンドは,もっぱら作業ファイルをオープンする場合に多用される。

次のマクロは,カーソルのある行を自動的に整形する例である。サンプルは単純な置換処理なので,ブロック選択したうえで範囲内置換すれば済むような話なのだが,擬似的であるにせよ完全なナローイング処理を実現できるので,かなり複雑な処理を施すことも可能だ。

==== sample.def 自動1行ブロック整形 ====
* macro
1 ""    ?.
        (tc-wc)??.                      ;オープンする余裕がなければ終了
        (mr==$80)?{ &m(36) . }          ;書込み禁止なら終了
        (mb)?{ &m("ブロックあり.") . }  ;ブロックモードでは停止
        ;; 必要に応じて変数の退避/保存をしておく
        #< #b #>                        ;カーソル行(改行含まず)をブロック
        #y                              ;切除する
        a=id,                           ;編集ファイルを記憶する
        mx+, #R "nul" #m                ;リードオンリーで'nul'をオープン
        (s)?'y'                         ;環境により確認の可能性あり
        mx-,                            ;イベントマクロ実行禁止を解除
        #i mb-,                         ;作業ファイル'nul'に出力
        ;; ====^ 処理の一例 ここから
        RX[+, ps[=pa,
        #56 "\([^:]+\):\([^,.]+\)\([,.]\)" #m "\2:\1\3" #m "ay"
        ps], RX],
        ;; ====$ 例示 ここまで
        #< #b #> #y                     ;処理が終了したら切除して
        #C                              ;閉じる(確認応答は不要)
        &#T(-a)                         ;起動時のテキストに戻して
        #i                              ;挿入すれば終了
*

上記の例では,敢えて実行過程が見えるようになっているが,通常は &s … &d を加えて実行過程がチラチラ見えないようにするのが美しいだろう。


コマンド拡張で学ぶVZマクロ入門 #71(#R)
The VZ resources, valid XHTML 1.0 Strict. ©2007-2019 by mezala.