CBT — 光标反向制表(CSI Z)
将光标回退 N 个 tab 停位 —— 与按 Tab 键方向相反。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[NZ\\033[
\033[1Z\\e[
\e[1ZESC [
ESC [ N Zhex
1b 5b <N> 5a说明
Cursor Backward Tabulation。末字节 Z(0x5a),将光标按 tab 停位向后回退 N 次(参数省略时默认 1)。它是 CHT(CSI Ps I)的镜像,也是 Tab 键(HT,0x09)的反向操作。若光标已在第 1 列或位于最靠前的剩余 tab 停位之前,则不动。默认 tab 停位为每 8 列,除非通过 TBC(\x1b[Ng)与 HTS(\x1bH)修改过。CBT 极少由手工输入,但对 terminfo 能力 cbt 与重放按键的 TUI(如表单字段的 Shift-Tab)有意义。
规范出处: ECMA-48 §8.3.7 (CBT)
示例
printf 'a\tb\tc\033[2Z|' # cursor jumps back 2 tab stops, then writes |import sys; sys.stdout.write('\x1b[2Z')fmt.Print("\x1b[2Z")process.stdout.write('\x1b[2Z')printf("\x1b[2Z");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- vim / neovim Shift-Tab in insert mode (`:imap <S-Tab>`)vim 默认的 `<S-Tab>` 插入模式绑定发 `\x1b[Z`,按一个 `shiftwidth` 反缩进 —— 在缩进行上按 Shift-Tab 时 `:set verbose=15` 可见。`:set softtabstop=0` 把行为切到字面 CBT 透传,对 Makefile 配方有用
- readline `menu-complete-backward` (Shift-Tab in bash)GNU readline 的 `menu-complete-backward` 控件 —— bash 4.3+ 默认绑定 `"\e[Z"`(CBT)—— 逆向循环候选项,不向终端发 CBT;该绑定*消费*按键并更新行编辑器
- fzf `--bind shift-tab:toggle+up`fzf 把 `\x1b[Z` 当作 `shift-tab` 路由到控件表 —— `~/.fzf.bash` 配方常将 Shift-Tab 绑定为多选切换并光标上移一击完成。skim 与 zoxide 模糊选择器走同一码路径
- ncurses form library navigationncurses `<form.h>` 渲染的表单字段用 `\x1b[Z` 做向后字段导航 —— `form_driver(form, REQ_PREV_FIELD)` 在表单处于默认 tab 驱动模式时内部映射到 CBT 发射。nmtui、alpine 配置对话框中可见
- terminfo `cbt` cap (queryable via `tput cbt`)`tput cbt` 查询 `cbt` 能力并发出终端特定的 CBT 字节序列 —— `xterm-256color`、`screen-256color`、`tmux-256color` 都映射到 `\x1b[Z`。脚本需要可移植的 Shift-Tab 发射而不硬编码字节时有用
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- CBT(
\x1b[Z)相较于 Backspace 多做了什么? - CBT 按*tab 停位*把光标向后回退;Backspace(BS,
\x08)只回退一列。默认 8 列网格、光标在第 17 列时,\x1b[Z一步到第 9 列,而 BS 需发 8 次。CBT 是 HT(\t)的参数化逆操作,也是 CHT(\x1b[I,见csi-cht)的镜像。光标已在第 1 列或位于最靠前的剩余停位之前时,CBT 不动作 —— 它绝不越过第 1 列。tab 停位本身由 HTS(\x1bH,见esc-hts)与 TBC(\x1b[g/\x1b[3g,见csi-tbc)控制,所以自定义布局会改变 CBT 的落点。 - 为什么
\x1b[Z有时在终端里什么也不做? - 三种常见原因。(1) 光标已在第 1 列 —— CBT 被夹住,报无移动。(2) 应用或先前的
\x1b[3g(TBC 清全部,见csi-tbc)抹掉了所有 tab 停位,CBT 没有可退之处,遂成空操作。(3) 你在 ConPTY 之前的cmd.exe中,其 CSI 支持为partial,会静默丢弃像Z这类不常见末字节 —— 现代 Windows Terminal 处理正常。在 CBT 前后用 DSR\x1b[6n(见csi-dsr)查询光标位置,看列号是否真的变了。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |