印刷
カテゴリ: テキストエディタ作成
参照数: 739

一度作ってみようと思い立った。ので、作ってみる。

やる気にムラがあるから、なかなか一気に進まないのだけど、

まずは基本の部分をきちんと実装することを目標にする。

開発を iMac でやってる関係で初期のテスト版は OSX 用に。

ただし出来るだけ環境依存の部分を切り離して移植しやすくして Windows 用も作る予定。

 

ということで、現状はこんな感じ。

 

 

 

 

テキストデータ

Piece table を利用。今の所 Linked List を使用しているけど、パフォーマンスに問題が出てきたら RedBlack Tree に変更するかも。

内部形式としてはほぼ UTF-8 で、ただし 1文字単位で進む/戻るをやりやすくするために、

UTF-8 から外れた文字をバイナリとして判断し、前後に 0xFF を付与。

また、Unicode IVS の場合は末尾に 0xFE を付与。これは戻る場合に IVS の判断をやりやすくするため。

改行コードは格納しない。

例:

0xFF, 0x07, 0xFF - 文字『0x07(BEL)』 を格納する場合

0xE9, 0x82, 0x8A, 0xF3, 0xA0, 0x84, 0x8F, 0xFE - 『邊󠄏』を格納する場合

 

行バッファ

一行を構成するテキストデータの開始/終了位置と、改行種類を格納する単純な構造体に近いクラステンプレート。

イテレータを実装してある。

これ、横に長い行だとパフォーマンスに問題があるから、チャンクに分ける構造にしないとだめかな。

 

行バッファ管理

全ての行バッファを格納。

Gap buffer を利用。ただし利用しているバッファを分割し、テンポラリファイルにスワップ可能にしてある。

 

その他

この他にウィンドウ管理、描画管理を行うクラスなどが存在する。

それぞれロジックのみを実装し、OS 依存しそうな部分は純粋仮想として継承先で実装する。

 

 

 

ファイルから読み込み、画面に表示。

カーソルを表示し、左右上下キーで文字間、行間の移動。

Fn+上下キーでページ移動。

…ここまでが現在動作している状況。

 

ファイル関連は、OS依存が大きい方法を使用してるので、ちょっと抽象化しきれていない。。

ここは結局 #ifdef とかで切り分けることになりそうな予感。

それ以外は今のところ問題なさそう。パフォーマンスにも問題は感じない。

100MB のファイルの読み込み表示も待ちすぎる感覚はなし。いずれ MacBook Pro(late 2009)でも試してみよう。

1000万行のファイルの読み込み表示も問題なし。

 

次は少し悩むけど、カーソル移動に合わせて画面のスクロールでも入れるかな。