Editor Link
参考にしたりしなかったりした link など.
これからエディタを作ってみようとする人にとっては
参考になるかもしれないしならないかもしれません.
Emacs ライクなエディタを作ろうとしてる人にとってはとても有用な内容です.
gap method による buffer の実装方法など実際的な内容と, エディタとしてのユーザイ
ンターフェースの考え方など, 非常に参考になります.
昔に出版されて邦訳もあったようですが, 今は上記のリンクから全文が読めます.
どっかで読んだんですが, これって Craig さんの卒業論文だったらしいですね.
でネット上に出回っているのを本人が後で知ったとか.
まあそれだけクオリティの高い内容であるのは確かですよ.
若干内容が古い点もありますが, エディタ作ろうと思ってる人なら読んでみるとよいでしょう.
buffer の実装方法について示唆に富む内容です.
実装方法については大きく分けて,
- 配列系
- リスト系
に分かれると思います.
配列系の代表は gap method (buffer gap) で, Emacs が採用してますね.
リスト系は, 更に doubly linked list と ツリー系に分かれるかもしれません.
doubly linked list (双方向連結リスト)については, まあ大抵は行単位でリストを構成
すると思われますが, vivi の作者の津田さんがとても詳しく解説され
ているサイトがあります. このあたり.
ツリー系は, 他の方法に比べるとツリーのバランス再構成という処理が複雑ではありますが, 全体
的には高速な方法だと云えるでしょう. Vim とか gtk のGtkTextBuffer などはツリー系
だったように思います.
上記の内容では, これらに加えてさらに piece table という, 配列とリストの中間的な
方法について論じています.
この piece table という方法はシンプルな上に高速で, 近代的な RDB のデータ格納方法
としても一部で採用されているようなことをどこかで読みました. 比較的最近の技術なのかな?
私もこの方法は面白そうだなと感じたです.
これを実装方法としているのは
AbiWord ってのがあります. エディタよりむしろワープ
ロらしいですが. red-black tree を利用して更に高速化できるという
議論もあるようです.
まあどういう方法を採用しても,
ちゃんと作り込めばまっとうな速度のものになる気がしますが...
ちなみに Edge では最初は Scheme で buffer を実装して GTK はブリッジだけにしようとして
たんですが, GtkTextBuffer をダイレクトに使う方がやっぱり全然速いので, GTK でラク
してます. (^-^)
The Gimp Toolkit.
1.x から 2.x にバージョンが上がり, エディタ用の widget は格段にレベルが上がりま
した.
使い勝手も向上し, うまく利用すればかなり高機能なこともできるようです.
とはいえまだ私は gtk プログラミングはよくわかってない部分があるのですが...
天下の GNU Emacs です.
他のエディタに比べればカスタマイズ性は高いですが, さすがにそろそろ Emacs lisp に
古さを感じる人もいるのではないでしょうか.
とはいえ素晴しいエディタであることには変わりありません.
xyzzy はすごいエディタです.
Windows 上の Common Lisp 塔載のエディタですが, Emacs like でありながら Windows
アプリとして使いやすい設計,
どうやってんのかわからないくらい高速な巨大ファイル処理, などなど.
あと, 作者の亀井さんのキッパリとした物の言い方が好きですね.
なんというか, ためらわず弱者を切り捨てるというか(笑).
しかしソースコードはダントツにコメントが無いんですが... (T^T)
亀井さんは頭の中に全部入ってるんでしょうか...色んな意味でスゴいです.
Vim は vi の後継というか高機能バージョンですね.
個人的にはあまり使ったことはないのですが, 整然としたコマンド体系には見習う点があ
るように思います.
ちなみに, キーの割当てが C のソースコードのレベルで switch 文で記述されているの
を見たときは, 「カスタマイズするべからず」というポリシーを感じました. これはこれ
でアリなんでしょうね.
Emacs とは違ってカスタマイズ性を設計思想の時点で排除するというのはひとつの方向性
だと思います.
ソースも Emacs に比べると読みやすいかも. というか個人的に GNU の C のインデント
規則はあまり好みでないってのもありますが(笑).
でも再描画ルーチンは ifdef の嵐でまともに読めなかった...枝刈り必須ですか.
Edwin は MIT Scheme を入れるといっしょにインストールされます.
これは scheme で書かれた Emacs like なエディタです.
当初はこれをパクれば余裕かなと思ったものの,
やはりマルチバイト文字にあまり考慮されてないようだった
点と, Edwin 用の API が C で書かれているものがあったりしたので,
それほど参考にはしていません.
Edwin は gap method を利用してるようなんですが, 文字列をいっきに確保して
string-set! を使うという方法を使ってるんです.
もし buffer を実装するとしても,
文字列を固定長としない Gauche ではこういうやりかたはどのみち速くないようで.
Windows 上の GreenPad の作者さんである K.INABA さんによる blog.
5月末から6月にかけて Gap buffer, Rope, PieceTable につ
いて詳しく書かれています.
というよりエディタ全般で私よりずっと詳しいし有用な内容ですね.
とても参考になるので勝手ながらリンクさせて戴きます.
役に立たないので戻る