Summary
在 tmux 左右分栏时,Codex 在一侧刷新消息会把另一侧内容和纵向分隔线一起“下拉”,导致分隔线消失、另一侧行距被拉大。单 pane 或非 tmux 环境不明显。
Repro Steps
- 启动 tmux,创建左右分栏。
- 在左右两侧各运行 Codex(建议使用 inline 模式,例如
codex --no-alt-screen 或 tui.alternate_screen=never)。
- 右侧输入一条会产生多行输出的消息(如“你是谁”),等待渲染完成。
Expected
仅右侧 pane 更新,tmux 纵向分隔线保持稳定,左侧内容不移动。
Actual
右侧更新时,左侧内容被整体向下拉,纵向分隔线消失,视觉上像整屏滚动了一段。
Environment
- Termux/Android + tmux(用户实际环境)
- Codex 0.114.0-exomind
Analysis / Hypothesis
Codex TUI 在 inline 模式下会使用 ratatui 的 scrolling-regions 优化,依赖 “滚动区域 + CSI S(Scroll Up)” 来给历史行腾位置。具体路径:
tui::draw 在 viewport 超出屏幕时调用 scroll_region_up 来把上方内容滚动出空间:
codex-rs/tui/src/tui.rs L470-L500(scroll_region_up(0..area.top(), area.bottom() - size.height))
- ratatui 在
scrolling-regions feature 下会发出 ESC[{top};{bottom}r + ESC[{n}S(设置滚动区域 + Scroll Up)
codex-rs/tui/Cargo.toml L66-L71 启用了 scrolling-regions
猜测 tmux 未完整处理/隔离这些滚动区域指令,导致它们被传递到外层终端,从而触发“整屏滚动”,把别的 pane 和分隔线一起拖动。这与观察到的分隔线消失、另一侧整体下移现象吻合。
Suggested Investigation
- 记录 Codex 渲染期间发出的 ANSI 序列(例如
tmux pipe-pane 或 script),确认是否包含 DECSTBM + CSI S。
- 在 tmux 下禁用
scrolling-regions(或运行时绕过 scroll_region_up)验证现象是否消失。
Possible Mitigations (Hypothesis)
- 当
Multiplexer::Tmux 时避免 scroll_region_up,退回到全量重绘路径。
- 或在 tmux 下强制走 alt-screen(但会改变 scrollback 体验,需要权衡)。
Summary
在 tmux 左右分栏时,Codex 在一侧刷新消息会把另一侧内容和纵向分隔线一起“下拉”,导致分隔线消失、另一侧行距被拉大。单 pane 或非 tmux 环境不明显。
Repro Steps
codex --no-alt-screen或tui.alternate_screen=never)。Expected
仅右侧 pane 更新,tmux 纵向分隔线保持稳定,左侧内容不移动。
Actual
右侧更新时,左侧内容被整体向下拉,纵向分隔线消失,视觉上像整屏滚动了一段。
Environment
Analysis / Hypothesis
Codex TUI 在 inline 模式下会使用 ratatui 的
scrolling-regions优化,依赖 “滚动区域 + CSI S(Scroll Up)” 来给历史行腾位置。具体路径:tui::draw在 viewport 超出屏幕时调用scroll_region_up来把上方内容滚动出空间:codex-rs/tui/src/tui.rsL470-L500(scroll_region_up(0..area.top(), area.bottom() - size.height))scrolling-regionsfeature 下会发出ESC[{top};{bottom}r+ESC[{n}S(设置滚动区域 + Scroll Up)codex-rs/tui/Cargo.tomlL66-L71 启用了scrolling-regions猜测 tmux 未完整处理/隔离这些滚动区域指令,导致它们被传递到外层终端,从而触发“整屏滚动”,把别的 pane 和分隔线一起拖动。这与观察到的分隔线消失、另一侧整体下移现象吻合。
Suggested Investigation
tmux pipe-pane或script),确认是否包含DECSTBM+CSI S。scrolling-regions(或运行时绕过scroll_region_up)验证现象是否消失。Possible Mitigations (Hypothesis)
Multiplexer::Tmux时避免scroll_region_up,退回到全量重绘路径。