CHT — 光标正向制表(CSI I)
把光标按 tab 停位向前推进 N 次 —— Tab 键的可带参数版本。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[NI\\033[
\033[1I\\e[
\e[1IESC [
ESC [ N Ihex
1b 5b <N> 49说明
Cursor Forward Tabulation。末字节 I(0x49,大写 i),按 tab 停位向前推进 N 次(默认 1)。是 CBT(CSI Ps Z)的镜像,也是 HT(\t,0x09)的可带参数形式。terminfo 能力名为 cht。HT 每次只能前进一个 tab,而 CHT 允许一次性跳跃任意个停位 —— 在 line discipline 可能吞掉 \t 的原始模式下尤为有用。
规范出处: ECMA-48 §8.3.10 (CHT)
示例
printf 'a\033[3Ib' # cursor advances 3 tab stops, then writes bimport sys; sys.stdout.write('\x1b[3I')fmt.Print("\x1b[3I")process.stdout.write('\x1b[3I')printf("\x1b[3I");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- vim / neovim `<C-i>` jump-list-forwardvim 的 `<C-i>` 跳转列表前进绑定(`<C-o>` 的逆操作)在多数终端上与 Tab 共享键码但语义不同 —— vim 在 `<C-i>` 后的终端模式重绘对显示缓冲的光标定位可能发 CHT 而非 HT。`:set verbose=15` 显示参数化形式
- less / more horizontal scroll (`<Right>` in `-#` chop mode)less ≥ 633 在 `--chop-long-lines` 下用 `\x1b[<N>I` 把可见窗口按 N 个 tab 停位向右滚动,而非发 N 个空格填充重绘 —— 保持已有屏幕内容稳定,仅平移视口
- GNU indent / clang-format tab-aware reformat`indent --tab-size=4` 与 `clang-format --style='{IndentWidth: 4, UseTab: ForIndentation}'` 在终端预览输出(`-d`/`--diff` 模式)中,当 diff 块跨越通过 TBC + HTS 设定的自定义 tab 网格时发 CHT —— 避免彩色 diff 输出中 N 个字面 tab 字符的视觉噪音
- ncurses `wtab()` / column-aligned table widgetsncurses 的 `wtab()`(窗口 tab 推进)映射到终端 `cht` 能力 —— `infocmp xterm-256color | grep cht`(= `\E[%p1%dI`)可见。`nmtui`、`dialog`、`alsamixer` 用它对齐多列字段标签,避免发可变长 HT 串
- GNU pr column layout (`pr -t -m -w 80`)GNU `pr -t -m -w 80`(多列合并模式)在 stdout 为终端且 `LC_ALL` 设置使 tab 网格非默认 8 时,在列间发 CHT —— 保持列边界整齐,不依赖接收终端对 HT 的解释
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 什么时候发 CHT(
\x1b[I)而不是字面\t? - 三种场景。(1) 未走 ONLCR / OPOST 烹饪的 raw 模式 ——
\t仍能通过,但若 TTY 处于完全 raw 且按字节维护列模型,带显式计数的 CHT 给你一次确定性发射,而非 N 个独立 HT 单元。(2) 一次跨越多个停位 ——\x1b[5I一个 CSI vs. 五个\t字节,慢速串口下延迟更低,日志也更易读。(3) 在 DCS / OSC 载荷内部,\t会被解析器视为数据而非控制。多数 TUI 用\t输出散文,因为它通过 terminfoht可移植;CHT(cht)是上述场景的参数化形式。CBT(\x1b[Z,见csi-cbt)是对称反向。 - CHT 会数被
\x1b[3g清掉的 tab 停位吗? - 不会 —— CHT 只数*当前设置的* tab 停位,所以一旦发了 TBC 清全部(
\x1b[3g,见csi-tbc)且未通过 HTS(\x1bH,见esc-hts)重设,\x1b[NI无论N多大都是空操作。光标不动,因为计数指的是光标会*落到*的停位,而非会*跨过*的列。这与清全部后\t失活属同族状态泄漏:任何为排版发 CHT 的代码必须在进入时重建 tab 停位,或在移动后用 DSR\x1b[6n检测是否真的发生了变化。防御写法相同 —— 把\x1b[3g与新鲜 HTS 布局配对,再交还控制权。
终端支持
- xterm
- 支持
- Linux console (fbcon)
- 支持
- macOS Terminal.app
- 支持
- iTerm2
- 支持
- Windows Terminal
- 支持
- cmd.exe / ConPTY
- 部分
- kitty
- 支持
- alacritty
- 支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 支持
- Konsole
- 支持
- tmux
- 支持
- GNU screen
- 支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |