环境

  • OS:ubuntu 24(桌面环境无关)
  • 终端:kitty
  • 复用器:tmux
  • 工具:OpenAI codex CLI(0.98)(交互式 TUI 界面)
  • 输入:中文/英文均会出现问题(与输入法无关)

我遇到的问题(现象)

  1. 在 kitty 里直接运行 codex CLI:
  • 按一次 Backspace(退格)会删除两个字符(像触发了两次退格)。
  • 不是 stty/TERM 简单设置能彻底解决。
  1. 用 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 的其它特性

我还尝试过但无效/不推荐的方案

  1. 仅改 TERM(对我无效)
  • 例如:TERM=xterm-256color codex
  • 有时能缓解,但对某些版本/环境并不能根治,因为根因不只在 TERM,而在键盘协议/事件处理。
  1. stty erase 调整(通常治不了“一次触发两次”)
  • stty erase 解决的是“退格发什么字符(^? 或 ^H)”
  • 但这里的问题是退格事件被处理成两次,属于更上层的输入事件兼容问题。
  1. 禁用 kitty 的扩展键盘协议(不作为首选)
  • 思路:让 kitty 不启用扩展键盘协议,降低触发兼容性问题概率
  • 代价:可能影响 kitty 的其它高级按键/交互能力,属于全局副作用;我更推荐 tmux 作为隔离层。

别人是怎么做的(社区共识/经验)

  • 这类问题在 codex CLI 的 TUI 与 kitty/alacritty 等现代终端组合下不算罕见:表现为 Backspace/Enter 等键在某些环境里“像被触发两次”。

  • 社区常见 workaround 有两类:

    1. 用 tmux 作为中间层(最常见、最稳定):把终端的现代键盘协议行为转换为传统 PTY 行为,交互式 TUI 程序更兼容。
    2. 调整终端/协议开关或用 pty 包装工具(如 script),本质也是“加一层兼容缓冲”。

最终结论

  • 目前我这边最稳定、体验也最好的组合是:
    kitty + tmux(mouse on + WheelUp 进 copy-mode)+ codex CLI
  • 这套方案的优点是:稳定、可复用、副作用小;后续即使 codex 官方修复了输入兼容问题,也不影响继续使用 tmux 的工作流。
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐