2008/06/29

行折り返し

例によって例のごとく、「主筆」の新バージョンを公開したから、今後やりたい事リストを書き連ねてみることにしようか。

最近、俺の中で気になっているのは、「主筆」は行を折り返して表示することができないということだ。ウインドウの右端で折り返して表示することができないのはもとより、一定文字数の単位で折り返して表示することもできない。それどころか、一行の長さはは最大10239文字までで、この制限はロジック中に定数値で書かれていて変更することもできない。

この制約は元々、「主筆」開発当初、すなわち2004年10月頃における決定事項に由来する。すなわち、最初から余り高度な機能を実現しようとすると、途中でモチベーションが維持できなくなるから、ある程度機能を絞って多少所しょぼい代物であっても構わないから、とりあえず動く物を作って公開することにしよう、という事だ。

この決定事項に基づき、俺は一行は最大10239文字(つまり10K文字)までと決めてしまい、かつ、行折り返しの機能は完全に諦めたのである。行を折り返して表示できるようにするとなると、明らかにテキストを描画するロジックが複雑になる。しかし、絶対に行を折り返して表示することはしないとすると、一行が極端に長いテキストを読み込まれたときに、甚だ困ったことが起きるものと予測される。つまり、ウインドウの表示に極端に時間がかかってしまったり、あるいは何らかの内部的な制約に引っかかったりするのではないかと、心配になったのだ。だから俺は、(1)面倒だから行折り返し機能は実装しない、(2)予測されうる問題を回避するために、一行の長さを制限する、という決定を下したのだ。

だが、ここに来てそろそろその決定を覆そうと考えている。すなわち、行の長さの制約を取り除き、行を折り返して表示する機能を実装するということだ。

行を折り返して表示すると言っても、いくつかのパターンが考えられる。まず第一に、一行がある程度以上の長さになったら、そこで強制的に折り返して表示するというものだ。テキストを描画する上で、やはり極端に横に長いといろいろと不都合が生じる危険性がある。だから、ある程度長くなったら自分自身を護るためにも、そこで強制的に折り返して表示するようにしてしまう必要があると考えられる。また、ユーザによってはある一定のところで折り返したいという欲求もあるかも知れない。それと二点目は、ウインドウの右端に来たら折り返して表示するという奴だ。これがいわゆる一般にに言うところの、行折り返し機能と言える奴だろう。

実装上及び機能上、この二つには共通部分もあるが共通しない部分もある。共通する部分としては、結局いかなるところで折り返そうとも一行が複数行として表示されるようになると言うことだ。現在の「主筆」は、一行のテキスト(つまり改行コードから次の改行コードまで)は、必ず一行で表示されることを前提として作成されている。その前提が崩れるのだから、内部的なロジックにはかなり甚大な影響が出るものと予測される。

共通しない部分としては、行を折り返して表示するタイミングの問題がある。まず、ある一定文字数以上になったら折り返すというのであれば、どこで折り返すのかを求めるのは存外容易である。つまり、テキスト中に含まれる文字数だけで、何行になって表示されるのかとか、どこの文字で折り返されるのかが容易に計算できる。更に、選択された文字がどの行に含まれるのかを計算するのも、比較的容易である。それに対して、ウインドウの右端で折り返すとなると、事態は一変する。つまり、どこで折り返すのかとか、結果として何行になるのかといったことは、各文字が描画されるときの幅を取得して、一行がウインドウの幅を超えるか超えないかという判断を行わなければならないのだ。これが固定ピッチフォントであれば、それもそれ程難しいことではないのだが、プロポーショナルフォントを表示する場合には、純粋に各文字の表示位置を計算してウインドウ幅と比較するという処理を行わなければならない。

ウインドウ幅で折り返す機能を実装するためには、各文字の幅を取得して、文字が表示される位置を計算しなければならない。そうしなければ、全体としての行数も判らないため、スクロールバーを表示することもできない。すなわち、テキストファイルを読み込んだタイミングで、一旦全てのテキストの表示幅を算出してやらねばならないということを意味している。そしてそれには時間がかかることが予測される。

そういった諸々を考えると、行折り返し機能は何かと大変なのではないかと思われる。

とりあえず、今現在特に対応したいと思っているのはそれぐらいだろうか。手元に転がっているMafefileやIniファイルの構文強調表示機能は、適当に時間を見繕って組み込めば良さそうだし、印刷機能の拡張(例えばカラー表示やプリンタ依存の拡張機能の利用など)は、今のところ余り必要性を感じていない。ツールバーはもとより実装する気はないし、ログを出力させる機能も個人的には欲しいところだが使う側としてはありがたみがない。プラグインやコマンド周辺の機能拡張もいくつか欲しいところだが、これはおそらく適当に気分が乗ってきたときにやることになるだろう。

そういうことで、第21版に搭載されるかどうかは判らない、というか今までの例からするとおそらくもっと後になるのだろうが、とりあえず行折り返し機能を実装する方法について、いろいろと考えを巡らしてみることにしよう。

0 件のコメント: