バグバグレポート作成から削除まで
Written at 1998.07.21
全てはちょっとした勘違いから始まった。
「改行文字指定マクロ」なる、初めての実用的(?)なマクロを作成し、その動作を確認している時だった。
「止まるやん……」
そう、止まったのだ。秀丸でのマクロ実行中、マクロコマンドを受け付けずに動作が止まってしまったのだ。
マクロコマンドでの永久ループに、はまったのでもない。要求したコマンドを実行できずに、秀丸ちゃんが困って動けなくなったのだ。
その実際の様子は、バグバグレポート Ver2.1に譲るが、早い話、禁則文字を一部動的に処理する際の、カーソル位置が原因だった。
この、「禁則文字の動的処理」というのが勘違いの最たるもので、その時から今まで、「カーソル位置」の方が原因だと思っていた。
いや、「カーソル位置」も確かに原因の一つなのだが、それに重点を置くと、バグバグレポートのように、カーソル動作によって解決しようとしてしまう。確かにカーソル動作で、マクロ動作停止は回避できるのだが、それだけでは十分でなかった。
「禁則文字の動的処理」とは、禁則文字1字分のぶら下げか、追い出しの処理を、入力に従って随時行う事を指す。その「禁則文字の動的処理」によって、カーソル位置がずれる。いや、秀丸上での位置がずれるわけではない。文章上での位置がずれるのだ。このずれを修正する為に、バグバグレポートのような方法を採ったのだが、それも十分ではなかった。
ぶら下げ処理は、全角で1文字以内。半角になると、秀丸での「折り返し文字数」と「ウインドウサイズ」に影響され、固定値ではない。これだけだと、何とかなっていたのだが、その固定値ではない、ぶら下げ文字数が、追い出し処理に動的変更された場合に生ずる、カーソル位置のずれまで、計算に入れていなかったのだ。
カーソル位置のずれを、簡単に再現してみよう。
秀丸(禁則処理[ON])で"a"を連続で行末まで入力する。行末まで来たら"."を、カーソルが次行に移動するまで入力(秀丸の設定によって、文字数は異なる)する。次行に移動したら、改行する。そして、"a"を数文字入力する。
以上の操作で、次のようなテキストが入力されているはずだ。
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..
.
aaaa
ここまで出来たら、2行目(表示上2行目なだけ。論理行的には1行目の行末)に移動し、改行文字を削除する。
すると動的に処理されたはずだ。次のように。
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
a...aaaa
当初、「ぶら下げ処理」されていた禁則文字が、行末移動によって「追い出し処理」に動的処理されたのだ。
この処理によって、行ごとの文字構成は変更されたが、カーソル位置は元のまま。秀丸上ではずれないが、文章上でずれている(カーソルは2行目の2文字目にあるが、その位置の文字は、ずれている)。
さて、カーソル動作での解決とは、カーソルを左右に移動させて、その位置を確定させるものだが、何故その様なことをしていたか、という説明がバグバグレポートだ。
その中で指定したテキストファイル(akt-txt.txt)を、指定したマクロ(改行-bug.mac)で処理して、動作を再現させる箇所があるのだが、実は、レポートにある環境変更だけでは、再現出来ない。「禁則処理」を[禁則レベル1]で、処理するようにしなければならなかったのだ(これに気付かなかったのが、勘違いの一等最初。気付いていれば、禁則処理が原因だと判ったのに)。
とりあえず、この様に「解決した」と、思っていたのだが、どうやらそうではない。最早、カーソル位置確定だけでは、済まない(いつ、どれだけの文字数で、「ぶら下げ」から「追い出し」に動的処理されるのか、判定するのが難しく、カーソル位置のずれを修正できない)。
「やはり、改行文字を削除してからほとんどの編集をするのが、全ての原因か……」
カーソル位置がずれるを、当然と考えてしまえば、要は、マクロ実行停止に至るような、動作をしなければいいのだ。
そう、秀丸より、マクロ動作手順が間違っていたのだ! コンセプト(改行している文字を基準に文章を編集する、という「改行文字指定マクロ」の名に恥じないもの)が間違っていたのだ!! ……いや、コンセプトと言うより、やっぱり手順。先にするか、後にするかの違いだ。
実際のマクロ動作にしても、後から改行文字を削除する方が、このマクロに関して言えば、断然効率がいい。その悪い効率で我慢していたのも、ほとんどの機能を後からの付け足した為に、基本動作を大きく変更しないように、強引に治めていたからだ。
しかし、ここに至っては変更せざるを得なくなった。……といっても、ほとんどカット&ペーストで済んだ。
注) 改行文字削除で、カーソル位置のずれが、起こるときは起こる。
(元の流れ)
改行のみ行や行末空白削除処理 − 改行文字確認 − 改行文字削除 − カーソル位置の確定動作(バグバグ Ver.2) − 次行の空白削除処理 − 隠しな行頭文字確認 − (次行へ)
(変更後の流れ)
改行のみ行や行末空白削除処理 − 改行文字確認 − 次行の空白削除処理 − 隠しな行頭文字確認− 改行文字削除 −
カーソル位置の確定動作(が不要になった) − (次行へ)と、大まかにこんな感じ
「これやったら、始めっからしときゃよかった」
後悔した事は、ないしょだ。
「バグバグ Ver.2」は無くなった。マクロ動作も無駄が(少)なくなった(多少速くなった……気がする)。いいことづくめである。
「………………なーんや、それっ!」(←代弁)
AKT 1998.07.21