置換

インデックスに戻る][ホームに戻る][掲示板にジャンプ][メールを送る]

現在ロードされているプログラムの一部の文字列を別の文字列に置き換える為のユーティリティです。

特長 & 機能
行番号による範囲の指定が可能
範囲内の全部の文字列を自動的に置き換えることができる。
UNDO機能が有る。
置き換えた部分をカラーで表示するので不要な置き換えをチェックできる。
オプションの指定により変数名のみ置き換えることができる。
オプションの指定により1箇所づつ確認しながら置き換えることができる。

使用方法
a.現在ロードされているプログラムに【置換】をマージする。
b.コマンドモードで goto *O[/[S][V]][,[<開始行>][-][<終了行>]] を入力する。
c.キンコンと音がして
d.変更前の文字列を聞いてくるので入力する。
e.変更後の文字列を聞いてくるので入力する。
f.ソース文字列をサーチし,置き換えた行をモニタに表示する。
(置き換えた文字はパレットコード5で表示する)
g.[b.]に戻る。
h. 終わりたい時は[SHIFT]&[BREAK]

ソース

詳細説明
[a.]で既にマージされていれば不要
[b.]で goto *O のみ入力した時は最後に行った範囲について行う。
(一番最初で範囲の指定を行わないときはすべての行について行う)
[,]のみを付加したときは[-59999]として扱う。
(私の場合,60000 以降はユ−ティリティエリアと決めているため)
[開始行],[終了行]は共に省略可能である。
([list]などと同じ)
オプションとして[/S]を指定すると置換前文字を赤[パレットコード2]で表示し,入力待ちとなる。
この時[Y]または[CR]キーを押すと文字を置き換え(表示が緑[パレットコード4]に変わる),その他のキーを押すと置き換えずにそのままにしておく。(表示が黄色[パレットコード6]に変わる)
オプションとして[/V]を指定すると置換前文字を変数名とする変数のみを置き換え,変数名でない場合は置き換えない。
両方指定したいときは[/SV],[/VS]両方とも有効です。
[d.]で[null]を入力すると置き換える前の状態に戻す。
(UNDO機能)
[e.]でASCIIコード0〜26の文字を入力すると[d.]に戻る。
([GRAPH][A][GRAPH][CR]などと入力する)
スペースを入力したいときはASCIIコード27を入力する。
([GRAPH][CTRL]&[ESC][GRAPH][CR]と入力する)

注意
ステートメントと他の文字を区別するために option list lcase で使って下さい。
文字定数内,data 文,コメント文中の変数名も変数名として扱われます。
従って[I]を別の変数名に置き換えるときは
open "I",#1,"I"
の[I]は両方共置き換えられるので[i]のように小文字か全角文字を使用することをお勧めします。
erace A のような配列変数名は A=1 の A と同じに扱われます。
line (0,0)-(1,1),,,B の B は B=1 の B と同じに扱われます。
変数名の A,A!,A#,A%,A$,A( などはすべて異なるのもとして扱われます。
置き換える量があまりに多いと no file space error がでますので init "MEM:16" などのようにRAMディスクの容量を増やしてからもう一度実行してください。
このプログラムはBASICで書かれているのでMZ-2800でも動くと思いますが唯一
63110 のPEEKのアドレスを変えるか,行数%=25などに変更する必要があります。
内部メモリの増設をしていない場合は下の様に変更してください。
一回毎に"MEM:"を[init]しているので必要ならば下のように変更して下さい。

使用目的
BASICプログラムのコンバート
( ropen (S25)→ open "i" (M25)など)
漢字変数,漢字ラベルなどの置換
2つのプログラムの合成時に変数名を重ならないようにする。

備考
私の場合,行番号 63000 以降に置いているので goto 63000,-100 でも使用可能。
行番号によるジャンプ行の指定は使用していないので自由なところにマージ可能。

EMM:が実装されているとき
63390 merge "EMM:置換前データ
63480 init "EMM:
63500 open "o",#1,"EMM:置換前データ
63620 open "i",#1,"EMM:置換前データ
63630 open "o",#2,"EMM:置換後データ
64190 merge "EMM:置換後データ

これ以降の場合は最初の1回目はファイルが無いのでエラーがでます。
そのときは goto 63470 を入力して下さい。

MEM:を破壊したくない時
63480 kill "MEM:置換前データ
63482 kill "MEM:置換後データ

EMM:を破壊したくない時
63390 merge "EMM:置換前データ
63480 kill "EMM:置換前データ
63482 kill "EMM:置換後データ
63500 open "o",#1,"EMM:置換前データ
63620 open "i",#1,"EMM:置換前データ
63630 open "o",#2,"EMM:置換後データ
64190 merge "EMM:置換後データ

EMM: & MEM:を使えない時
63390 merge "FD1:置換前データ
63480 kill "FD1:置換前データ
63482 kill "FD1:置換後データ
63500 open "o",#1,"FD1:置換前データ
63620 open "i",#1,"FD1:置換前データ
63630 open "o",#2,"FD1:置換後データ
64190 merge "FD1:置換後データ


解説
MZ-2500を手にして初めのうちは漢字変数が使えるのが嬉しくて,一々かな漢字変換していたのですが,さすがに面倒になり,これを作りました。
普通のエディタの置き換え機能は全置換,逐次置換,個数指定などの方法が取られていますがそれぞれ欠点が目につきます。
全部まとめて置き換えてしまうと必要の無い所まで置き換えてしまい,後で泣きを見ることが多い(置き換えた所を表示しないものが多いので分からない)
逐次置換は全部だと分かっていても,一々答えなければならないので面倒である。
個数指定は先にいくつあるか個数を数えておくのは面倒であるし,有り得ないほど大きな数値を指定するのはスマートさに欠ける。
そこでとりあえず全部まとめて置き換え,置き換えた場所を分かりやすく表示し,もし予想外の置き換えを行った時はキャンセルできるようにしました。
これなら後で困ることも少ないでしょう(無いとは言い切れない)
また初めから置き換えたくないものが混じっていることが分かっている時のためにオプションの指定により逐次置換も可能にしました。
さらに,よくループ変数や一時変数に I や A を使って重複したときにこれらの1文字だけでは他の変数名の一部に使われている可能性が高く,逐次置換では手間が掛かりすぎるので,独立した変数であるかどうかを判別する機能も付けました。
範囲の指定可能にしたのは,もともと全部のリストをサーチしたのではさすがに遅く,少しでも速くしたかったからです。
ところがこのお陰でサブルーチンの内部の変数名がメインと重なったときにサブルーチン内部のみ変更できるようになりました。
範囲や文字列を1つづつ入力するようにしたのは
まとめてパラメータとして渡すためにはターミネータが必要です。
[,]をターミネータにすると[,]自信を含む文字列を置き換えできません。
["]でくくると["]自信を含む文字列を置き換えできません。
そう言う訳で別々に入力するようにしました。これなら[CR]と[スペースのみ]以外のすべてのコードを入力できます。
また変数名の変更は良く似た名前が多く何度も同じ文字を入力するのは面倒です。
ところがこの方法であれば前回の文字を加工するだけで済むようになります。
【置換】と【マージ】があればBASICの欠点である行番号の依存と,ローカル変数の無いことがあまり問題で無くなります。(サブルーチンの再帰的呼び出しができないことと若干手間が増えるという欠点が残る)
このプログラムにでてくる唯一の peek 文の本来の目的はモニタの表示行数を求めることではなく,init "KB:,,,0" の代わり,即ち置換文字データの入力後漢字入力モードを自動的に抜けるために 63450 行で使用しています。
私の持っているBASICのバージョンではキ−入力シミュレーション時にはこのステートメントでは漢字入力モードを解除できません。
もし,解除できるのであれば 63110 行を取り,63450 行を init "KB:,,,0" に変更しておいたほうが良いでしょう。


他機種への移植:
付属のエディタに置換機能がある場合は特に必要ないでしょう。
コマンド/ステートメントと変数名の区別がつかないようなカス言語への移植もやめておいた方が良いでしょう。
変数名の肥大化により貴重なプログラムエリアが圧迫されるようなカス言語への移植はやめておいた方が良いでしょう。
(・_・):ほな何やってら、移植できんねん。
(^_^):まず無いやろなぁ。

インデックスに戻る][ホームに戻る][掲示板にジャンプ][メールを送る]