跳到主要内容
ansicode

CBT — 光标反向制表(CSI Z)

将光标回退 N 个 tab 停位 —— 与按 Tab 键方向相反。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[NZ
\\033[\033[1Z
\\e[\e[1Z
ESC [ESC [ N Z
hex1b 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)

示例

bash
printf 'a\tb\tc\033[2Z|'   # cursor jumps back 2 tab stops, then writes |
python
import sys; sys.stdout.write('\x1b[2Z')
go
fmt.Print("\x1b[2Z")
javascript
process.stdout.write('\x1b[2Z')
c
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
支持

相关序列

在家族食谱中

C0 食谱 · 3. HT —— 水平制表与 TBC / HTS 渊源