42.21 抽象显示

Ewoc 包用于构建表示 Lisp 对象结构的缓冲区文本,并在该结构发生变化时更新文本以保持同步。这类似于 “模型—视图—控制器(model–view–controller)” 设计范式中的 “视图(view)” 组件。Ewoc 意为 “Emacs’s Widget for Object Collections(Emacs 对象集合控件)”。

一个 ewoc 是一种组织相关信息的结构,用于构建表示特定 Lisp 数据的缓冲区文本。ewoc 的缓冲区文本按顺序分为三部分:首先是固定的 页眉(header) 文本;其次是一系列数据元素(你指定的 Lisp 对象)的文本描述;最后是固定的 页脚(footer) 文本。 具体来说,一个 ewoc 包含以下信息:

通常,你使用 ewoc-create 定义一个 ewoc,然后将生成的 ewoc 结构传递给 Ewoc 包中的其他函数,在其中创建节点并在缓冲区中显示。一旦在缓冲区中显示,其他函数可用于确定缓冲区位置与节点之间的对应关系,将点从一个节点的文本表示移动到另一个,等等。See 抽象显示函数

一个节点会 封装(encapsulates) 一个数据元素,类似于变量保存一个值。通常,封装是在向 ewoc 添加节点时完成的。你可以获取该数据元素的值并替换为新值,示例如下:

(ewoc-data node)
⇒ value

(ewoc-set-data node new-value)
⇒ new-value

你也可以将 Lisp 对象(列表或向量)作为数据元素值,用它来存放真实值,或作为指向其他结构的索引。示例(see 抽象显示示例)采用了后一种方式。

当数据发生变化时,你需要更新缓冲区中的文本。可以调用 ewoc-refresh 更新所有节点,或使用 ewoc-invalidate 仅更新指定节点,也可以通过 ewoc-map 更新所有满足谓词条件的节点。或者,你可以使用 ewoc-deleteewoc-filter 删除无效节点,并在其位置添加新节点。从 ewoc 中删除节点时,其对应的文本描述也会从缓冲区中一并删除。