入力窓を開いて入力を促すときに,定型的な文字列を初期文字列として設定することができます。まず,初期文字列設定機能を持っている関数&g()
入力窓です。
1 ^^ "" ?.
&g("標題",40,"初期文字列") &Cr
&m("%s",pw)
製品版のVZでは,初期文字列を設定するとヒストリーバッファの先頭に上書きしてしまいますが,高橋版VZであれば既存の履歴を破壊しません。
以上は関数&g()
入力窓特有の設定の方法ですが,検索文字列バッファ等に文字列を仕込んでおくこともできます。関数&Sh()
はヒストリー格納ができる文字列関数で,既存の履歴を破壊することなく文字列を格納することができます。
1 ^^ "" ?.
&Sh(ps,"3番目")
&Sh(ps,"2番目")
&Sh(ps,"1番目")
#F #e &Cr
関数&g()
は初期文字列機能を装備しているので何の工夫も要りませんが,他のコマンドや関数による入力窓では履歴をひとつ遡ることが必要です。履歴を遡るにはコマンド#e
を使用します。#e
は編集モードではカーソルを上に移動する機能がありますが,入力窓やコマンドラインでは履歴を遡る機能があります。
先の例では,文字列をひとつずつ格納していますが,文字列の区切りが1個のヌルであることから,次のようなこともできます。
1 ^^ "" ?.
&Sh(ps,"1番目 2番目 3番目")
ps.6=ps.13=0,
#F #e &Cr
呼び出したい順に空白等で区切って並べればよいので,見た目にわかりやすいということと,速度面でわずかに有利です。当然のことですが,ヌルを埋め込むアドレスがずれると悲惨なことになるということと,細切れにした結果の文字列が既に履歴に存在していてもそのまま格納されるという問題はあります。
入力窓のキャンセルは単にコマンド#[を発行するだけですから特に問題はありませんが,編集画面に戻るということが意外に手間のかかるものです。
通常の入力窓はキャンセルすると起動時のモードに戻りますが,コマンド#L
(ファイルのクローズとオープン)の動作はやや特殊で,予期せぬモードに移行する場合があるので,意識して編集画面に戻る必要があります。
1 ^^ "" ?.
#L
(s==3)?#[
; ;ここで入力窓になっている
:a (s)?{ ;どこでも編集モード by Tomo
(wa)?#[
?{ wa=wo, (z)? #[ }
>a
}
通常は編集テキストがあることが前提になっています(冒頭に「?.
」があるので編集モードでしか起動できない)ので,ここまで周到にやる必要はないかもしれません。要するに何かにかこつけて榊原氏の「どこでも編集モード」
を紹介したかっただけ。(笑)
改行を含まない短いテキストを加工しようとするとき,入力窓を作業スペースとして使うのはなかなか便利なものです。テキストの加工には作業ファイルをオープンするのが普通ですが,それよりも手軽かつ迅速に開け,窓を閉じれば必ず元のテキストに戻れます。ただし,本来の目的から外れた使い方になるので,履歴に影響を与えないように戻る必要があります。
入力窓に一時的に文字列を貼り付けるためには,削除バッファに取得しておく必要があります。ヒストリー格納という手もないわけではありませんが,あくまでも入力窓を作業用に使うわけですから,履歴に影響を及ぼすのは避けるのが筋というものでしょう。
削除文字列を復活したときのカーソル位置は,どのコマンドを使ったかで決定されます。[BS]系コマンドを使った場合はカーソルが文字列の末尾にあるので,その位置から右に向かって処理することはできません。処理に応じてカーソルをあらかじめ移動しておく必要があります。
1 ^^ "" ?.
#O #u #<
(ct==1)?{ #[ . }
(-1){ cp.0+=1, #d (ct==1)?{} }
#H #[ #u
ずばり,高橋版VZを使いましょう。それだけ。(おいおい)
高橋版で拡張されたこの機能は,実はめざらが高橋先生に無理にお願いしたものだったのですが,色々と大変だったようです。高橋先生曰わく。「c.mos さんが単純コピーにした理由が身に染みてよくわかった。(^^;」
さて,高橋版以前にどのような方法で対処されていたかというと,m.gann師による次のようなパッチマクロでコードセグメントの一部を書き換えていました。
; dz[=vz, ((r$a866)..2==$b05e)?r.3=$90, dz], ;vz 98
; dz[=vz, ((r$a81e)..2==$b05e)?r.3=$90, dz], ;vz PC
; dz[=vz, ((r$a9e6)..2==$b05e)?r.3=$90, dz], ;svz 98
; dz[=vz, ((r$a9a0)..2==$b05e)?r.3=$90, dz], ;svz PC
この場所の5Ehを90hに書き換えることで何故履歴コピーになるのかは全く解りませんが,ともかくm.gann師おそるべしということでしょう。
これはマクロFAQではありませんが,有用なカスタマイズ方法として書いておきます。
ファイル名入力窓のタイトルは,テキストウィンドウで設定できます。テキストウィンドウの記述エリアは,行頭の「*」と0個以上のスペースと「T」で始まる部分です。(タイトルサーチを有効にすればデフォルトでサーチできます。)
* T テキストウィンドウ
あるいは,
* Text windows
初期設定では次のようになっていて,カレントディレクトリを表示するようになっています。
"【入力ファイル】 <$pd>",40
これを次のように,[現在オープンしているファイル数/オープン可能なファイル数]の表示を加えます。
"Open File: <$pd> [$wc/$tc]",50
このように設定した場合の入力窓は,次の図のようになります。この例は,2つのファイルをオープンしている状態です。
コマンド#F
やコマンド#56の検索文字列入力窓では,直前の編集モードでのFEPの状態が入力窓でも引き継がれますが,関数&g()
の入力窓やコマンド#J
(指定行番号ジャンプ=#45
)の入力窓では起動前にオンにしてあったFEPがオフになってしまいます。行番号の入力などオフの状態でよい場合ならよいのですが,マクロの中で&g()
を使用して日本語の入力を促す場合はFEPがオフになってしまうのはなかなか迷惑ですね。
さて,こんなときに&g()
にFEPを制御させないためのテクニックを紹介します。
1 ^^ "" ?.
fr+, &g("日本語で入力") &Cr fr-,
変数frは,本来はVZの起動と同時にFEPをオンにするスイッチです。しかし起動後は入力窓等でのFEP制御のために直前のシステムモードが保存されるようになっています。&g()
の入力窓を立ち上げると,このfrが参照されて,その値が0,つまり編集モードのシステムモードの値が入っていた場合はFEPが制御されてオフになるというシステムになっているわけです。そこを逆手に取って,frに0以外の値を代入しておき,&g()
がfrを参照した時に,まるで直前のシステムモードが編集モードでなかったかのように見せてVZを騙すという,要するに裏技のたぐいになりますね。覚えておいて損のない裏技ですから,大いに使いましょう。