统一 prose 换行为 UAX #14
- 日期:2026-07-19
- 提交:
feat(tui): 统一 prose 换行为 UAX #14 断行规划器 - 版本:
0.12.1-alpha.1
这是一次换行(自动折行)逻辑的底层统一。此前 wrap、prompt 输入换行、Markdown 渲染、语法高亮四处各自维护一套贪心分词换行实现,行为并不完全一致;本次将它们全部收敛到统一的断行规划器(linebreak planner)。
主要变化
-
换行遵循 Unicode 标准(UAX #14)
规划器在完整文本上一次性计算字素簇(grapheme)与 UAX #14 断点,并结合终端显示宽度决定折行位置。样式着色只是对已确定的字节范围做投影,不再影响断行结果:同一段文字,无论是否高亮,折行位置都一致。 -
URL 不再被从中间切断
形如链接的 token 会被作为整体保留,尽量不在中间断开(包含对包裹标点的回退处理)。这让长链接在窄终端里更容易被识别和复制。 -
换行行为的可见变化
文件路径与包含连字符的词,现在会按 UAX #14 的合法断点换行,而不再在任意列硬切。例如较长的路径或foo-bar-baz一类词,折行位置会更符合阅读直觉。(注意:文件路径本身不做“整体不切断”的保护,仅按标准断点换行。) -
CJK 与特殊字符处理更规范
加入了 CJK 禁则(避免行首/行尾出现不应出现的标点);LS/PS/NEL、单独的CR以及CRLF都按强制换行(mandatory break)处理。
你会注意到什么
- 长链接、长路径在窄窗口下的折行位置更合理,不会在中间生硬断开。
- 中英文混排、含标点的段落换行更自然。
- 极少数情况下,如果你之前依赖“在某个固定列硬切”的视觉效果,换行位置可能与旧版本略有不同,这是预期内的行为变化。
这是一次以“正确性与一致性”为目标的重构:删除了约 700 行重复实现,并为 user 消息在变宽 resize 时的行数复用做了性能优化(按构造期单调性以 O(1) 复用旧行数,而非重新扫描正文)。对使用者而言,主要收益是各处换行终于表现一致。