2.9 KiB
Ebox
Ebox 是一个独立的 Emacs Text/Box 布局引擎,负责文本测量、Box 几何、 row/column/flex/Grid 布局、retained 渲染和增量 buffer 发布。应用还需要 Component、响应式状态、behavior 或生命周期时,使用同级 ETAF 包。
安装
Ebox 需要 Emacs 29.1 或更高版本,并依赖 ECSS 与 TP。包管理器应自动安装声明的
依赖。使用同级源码 checkout 时,把三个目录加入 load-path 后加载 Ebox:
(add-to-list 'load-path "/path/to/ecss")
(add-to-list 'load-path "/path/to/tp")
(add-to-list 'load-path "/path/to/ebox")
(require 'ebox)
加载 Ebox 不会创建 buffer,也不会构建 native 模块。
第一次渲染
普通用户只需理解七个 author 入口:字符串、text、box、row、column、
flex 和 grid。子节点直接嵌套,不存在第二套 field-based child 语法。
(require 'ebox)
(ebox-render-to-buffer
"*Ebox Example*"
(ebox-build
'(column :padding (1 2)
:border (1 solid "#8A93A6")
(text :color "#263244" "Hello Ebox")
(row :item-gap 1
(box "Left")
(box "Right")))))
普通 author DSL 统一通过 ebox-build。框架集成可以用一个
ebox-source-builder 组合 typed node,再把 forest 与同一代 source facts 封装为一个
CanonicalEboxInput;这个 evaluated API 不是第二套 author 语法。
如何选择布局
box创建普通视觉盒子;row和column用于简单的一维组合;flex用于空间分配和换行;grid用于二维轨道与放置;- 裸字符串是
(text "...")的简写。
Flex/Grid participation property 直接属于子 box,不需要额外 wrapper 节点。
渲染与更新
ebox-render返回带属性文本,不发布 live buffer;ebox-render-to-buffer挂载 retained surface;ebox-commit原子发布重新构建的 canonical input;ebox-buffer-update-report返回最近一次成功更新报告;ebox-rerender-buffer-with-context应用显式 viewport 变化。
Ebox 会在分配 runtime identity 前复制 canonical input,因此同一个 built value 可以 挂载到多个 buffer,而不会共享 live ownership。
可选 native 模块
Rust 模块只加速符合条件的 reflow;它不是正确性的依赖,并有完全等价的 Elisp fallback。Ebox 加载时不会自动构建它。
(ebox-native-status)
(ebox-native-build)
验证
make load EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
make compile EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
make docs-contract-tests EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
make check EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
make native-rust-tests
继续阅读用户指南、公共 API 参考,以及同级 ebox-playground 示例。