Ewocパッケージは、Lispオブジェクトの構造を表すバッファテキストを構築し、その構造の変更に合わせてテキストを更新します。これは、「モデル・ビュー・コントローラ」設計パラダイムにおける「ビュー」コンポーネントに相当します。Ewocは「Emacs' Widget for Object Collections」の略です。
ewocとは、特定のLispデータを表すバッファテキストを構築するために必要な情報を整理した構造体です。ewocのバッファテキストは、順に3つの部分で構成されています。まず、固定のヘッダーテキスト、次に一連のデータ要素(指定するLispオブジェクト)のテキストによる記述、そして最後に固定のフッターテキストです。具体的には、ewocには以下の情報が含まれます:
通常、ewoc-create で ewoc を定義し、得られた ewoc 構造体を Ewoc
パッケージ内の他の関数に渡して、その中でノードを構築し、バッファに表示します。バッファに表示されると、他の関数がバッファ位置とノードの対応関係を決定し、あるノードのテキスト表現から別のノードのテキスト表現へとポイントを移動させる、といった処理を行います。抽象表示関数を参照してください。
ノードは、変数が値を保持するのと同様に、データ要素をカプセル化します。通常、カプセル化はノードをewocに追加する際の一環として行われます。次のように、データ要素の値を取得し、そこに新しい値を代入することができます。
(ewoc-data node) ⇒ value (ewoc-set-data node new-value) ⇒ new-value
また、データ要素の値として、実際の値を格納するコンテナであるLispオブジェクト(リストまたはベクトル)や、他の構造体へのインデックスを使用することもできます。例(Abstract Display Exampleを参照)では、後者の手法が用いられています。
データが変更された際は、バッファ内のテキストを更新する必要があります。ewoc-refresh
を呼び出してすべてのノードを更新したり、ewoc-invalidate
を使用して特定のノードのみを更新したり、あるいは ewoc-map
を使用して述語を満たすすべてのノードを更新したりできます。あるいは、ewoc-delete や
ewoc-filter
を使用して無効なノードを削除し、代わりに新しいノードを追加することも可能です。ewoc
からノードを削除すると、それに関連付けられたテキスト記述もバッファから削除されます。