バグバグレポート作成から削除まで

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


 

 戻る