Note

サイト
最近のコメント
 | 

2004-06-04

[] バイナリエディタに向いたデータ構造

…を延々考えて、でも時間が無くて、でもThebeを書き直すことはほぼ心に決めてて…。

データ構造といってもバッファの構造じゃないです。言っちゃなんですが何を使っても事実上問題ない事がわかりました。(^^
きっと10MBのファイルを連続したギャップバッファ(どころかvectorでも)に押し込めて二画面分割状態でファイルの先頭と末尾を交互に編集したところで、どうって事ないでしょう。

悩んでいるのは、データを「行」に格納できない条件での、「行」の構造です。

テキストエディタでは、k.inabaさんが書いておられるように、双方向リンクリスト(またはギャップバッファ)で管理された行が、それぞれ、その行の分の文字の配列を持つのが一般的です。

Thebeでは行そのものがデータを持てないので、代わりに連続したバッファ中の位置を示す情報を行が持つ必要があります。ただしその場合は一文字挿入しただけでも以降の行をすべて更新せねばならず、それが今のThebeが遅い理由でした。

あと、現在、行が主体になって色分けしてますので(各行は末尾の構文解析Stateを持つ)、バイナリ表示モードでは(キーワードが複数行にまたがる可能性があるので)色分けが動いていないのもどうにかしたいのです。

それで…いっそ、「行」を管理するのをやめてしまえばどーかなー、なんて漠然と考えていたりします。
バッファと平行してまったく同じ構造をもつ状態保持用の副バッファを用意して、そこに「3バイト文字の2文字目」とか「ここで改行」とか構文解析Stateとかの状態を詰め込んで、画面描画や移動などの行を主体とした作業もすべて、地道にその状態バッファをたぐっていって行えばいいんじゃないか…と。

小さいファイルの編集は今より遅くなるかもしれませんが、最大で画面に表示される分だけたぐればいいので、大きいファイルでもある程度以上は遅くならない…でいてほしい。それをキーボードのリピート速度より速くすることができればOKなわけです。また、行は現在双方向リンクリストで管理してますので、やめてしまえばメモリ消費量の改善も見込めます。逆に、現在何行目、とか、全部で何行あるか、とかの管理がえらそうなのが難点、というか、本当に可能なのかどうかすらわかりません。

うまくいくかどうか、試しに実装してみる時間が欲しい。どなたかください(^^*1

[] どうしよう

kMonos.NETの伝言板で、k.inabaさんに、バッファを行と別に管理しながら、オーダーを落とさない方法を教えていただきました。

考えれば考えるほど、ギャップバッファというのはよくできた構造です。

しかし…ここまでされておきながら、ギャップバッファを採用するのは…何といいますか、単純に、とても悔しいのです。(^^;

ここは一発画期的なオリジナルのデータ構造を…思いつけたら苦労は無いです。

どうしよう。

とりあえず、バイナリ表示モードでも使えるように構文解析用Stateは行とは無関係な副バッファに持たせる、までは決定です。

で、そこから先は…

どうしよう。

*1:こっそりさぼってはてなダイアリーにこんなこと書いてるのは内緒ですよ

びびすけびびすけ 2013/07/24 12:48 「バッファを行と別に管理しながら、オーダーを落とさない方法」を知りたいのですが、kMonos.NET のどこに説明があるのか教えていただけないでしょうか?

ytqwertyytqwerty 2013/08/01 22:40 しばらくこちらを見ていませんでした。ごめんなさい。
既に稲葉さんに尋ねられているようですので、( https://twitter.com/vivisuke/status/359893339866267649 )それは省かせていただくとしまして
> kMonos.NET のどこに説明があるのか
今は撤去されているようですが、昔は掲示板があったんですよ……。

重ね重ね見落としごめんなさい。

ちなみにthebeについては、上に書いてますように、そもそも「行」を管理するのをやめました。
テキスト編集モードであっても毎回頑張って1文字1文字辿って改行探して前の行や次の行を検出しています。

 | 
カレンダー
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 |
Connection: close