解决codex中退格同时删除两个字符(tmux、kitty)
·
环境
- OS:ubuntu 24(桌面环境无关)
- 终端:kitty
- 复用器:tmux
- 工具:OpenAI codex CLI(0.98)(交互式 TUI 界面)
- 输入:中文/英文均会出现问题(与输入法无关)
我遇到的问题(现象)
- 在 kitty 里直接运行 codex CLI:
- 按一次 Backspace(退格)会删除两个字符(像触发了两次退格)。
- 不是 stty/TERM 简单设置能彻底解决。
- 用 tmux 包一层后:
- Backspace 变正常了。
- 但鼠标滚轮向上会变成“上一条命令”(等价于按了 ↑),无法正常滚动终端历史,体验很差。
解决办法(最终最佳实践)
第一步:用 tmux 规避 codex + kitty 的退格问题
- 直接进 tmux 再运行 codex:
tmux
codex
可选:做一个 tmux 会话,方便重复使用:
tmux new -As codex
codex
第二步:修复 tmux 下滚轮“变成上一条命令”的问题(推荐方案 A)
原因:
- tmux 默认在某些交互场景下会把滚轮事件当成 Up/Down 键发送给前台程序
- codex/ shell 收到 Up 就回到上一条命令,所以看起来像“滚轮在翻历史命令”
做法:在 ~/.tmux.conf 增加以下配置,让滚轮进入 copy-mode 实现滚屏,而不是发 Up/Down:
set -g mouse on
bind -n WheelUpPane if-shell -F "#{mouse_any_flag}"
"send-keys -M"
"copy-mode -e; send-keys -M"
bind -n WheelDownPane send-keys -M
然后重载配置:
tmux source-file ~/.tmux.conf
效果:
- codex 中 Backspace 不再“一次删两个字”
- tmux 中鼠标滚轮恢复为正常滚屏(通过 copy-mode 滚历史输出)
- 不需要全局牺牲 kitty 的其它特性
我还尝试过但无效/不推荐的方案
- 仅改 TERM(对我无效)
- 例如:TERM=xterm-256color codex
- 有时能缓解,但对某些版本/环境并不能根治,因为根因不只在 TERM,而在键盘协议/事件处理。
- stty erase 调整(通常治不了“一次触发两次”)
- stty erase 解决的是“退格发什么字符(^? 或 ^H)”
- 但这里的问题是退格事件被处理成两次,属于更上层的输入事件兼容问题。
- 禁用 kitty 的扩展键盘协议(不作为首选)
- 思路:让 kitty 不启用扩展键盘协议,降低触发兼容性问题概率
- 代价:可能影响 kitty 的其它高级按键/交互能力,属于全局副作用;我更推荐 tmux 作为隔离层。
别人是怎么做的(社区共识/经验)
-
这类问题在 codex CLI 的 TUI 与 kitty/alacritty 等现代终端组合下不算罕见:表现为 Backspace/Enter 等键在某些环境里“像被触发两次”。
-
社区常见 workaround 有两类:
- 用 tmux 作为中间层(最常见、最稳定):把终端的现代键盘协议行为转换为传统 PTY 行为,交互式 TUI 程序更兼容。
- 调整终端/协议开关或用 pty 包装工具(如 script),本质也是“加一层兼容缓冲”。
最终结论
- 目前我这边最稳定、体验也最好的组合是:
kitty + tmux(mouse on + WheelUp 进 copy-mode)+ codex CLI - 这套方案的优点是:稳定、可复用、副作用小;后续即使 codex 官方修复了输入兼容问题,也不影响继续使用 tmux 的工作流。
更多推荐
所有评论(0)