42.21 Абстрактное отображение

Пакет Ewoc формирует текст буфера, который представляет структуру объектов Lisp, и обновляет текст при изменениях в этой структуре. Это подобно компоненту «представление» в парадигме проектирования «модель–представление–контроллер». Ewoc означает «Виджет Emacs для коллекций объектов».

Ewoc — это структура, которая организует информацию, необходимую для построения текста буфера, представляющего определённые данные Lisp. Текст буфера ewoc состоит из трёх частей: сначала фиксированный заголовок; затем текстовые описания серии элементов данных (объектов Lisp, которые вы указываете); и наконец, фиксированный подвал. В частности, ewoc содержит информацию о:

Обычно вы определяете ewoc с помощью ewoc-create, а затем передаёте полученную структуру ewoc другим функциям пакета Ewoc для создания в ней узлов и отображения в буфере. После того как она отображена в буфере, другие функции определяют соответствие между позициями в буфере и узлами, перемещают точку от текстового представления одного узла к другому и так далее. См. Функции абстрактного отображения.

Узел инкапсулирует элемент данных подобно тому, как переменная хранит значение. Обычно инкапсуляция происходит как часть добавления узла в ewoc. Вы можете извлечь значение элемента данных и поместить новое значение на его место, например:

(ewoc-data узел)
⇒ значение

(ewoc-set-data узел новое-значение)
⇒ новое-значение

Вы также можете использовать в качестве элемента данных объект Lisp (список или вектор), который является контейнером для реального значения, или индекс в некоторую другую структуру. В примере (см. Пример абстрактного отображения) используется последний подход.

Когда данные изменяются, вы захотите обновить текст в буфере. Вы можете обновить все узлы, вызвав ewoc-refresh, или только определённые узлы с помощью ewoc-invalidate, или все узлы, удовлетворяющие предикату, с помощью ewoc-map. Кроме того, вы можете удалить недействительные узлы с помощью ewoc-delete или ewoc-filter и добавить новые узлы на их место. Удаление узла из ewoc также удаляет связанное с ним текстовое описание из буфера.