terminfo 能力 → ANSI 转义码对照
ncurses / terminfo 能力名(即传给 `tput` 的参数)在现代 xterm-256color 终端上展开成的 ANSI / VT 转义序列。把老 shell 脚本从 `tput` 迁移到裸字节、调试 TUI 输出的「错误字节」,或者只是想搞清楚 `tput setaf 1` 到底发送了什么时,可以查这张表。
属性(SGR)
| tput 能力名 | terminfo 全称 | 序列 | 说明 |
|---|---|---|---|
| sgr0 | exit_attribute_mode | \x1b[0m | 重置所有文本属性与颜色,等价于 SGR 0。开启任意属性后都应配套使用。 — SGR 0 — 重置 / 恢复默认 |
| bold | enter_bold_mode | \x1b[1m | 加粗 / 高亮。使用 `sgr0` 或 SGR 22 关闭。 — SGR 1 — 加粗 / 高亮 |
| dim | enter_dim_mode | \x1b[2m | 半亮(弱化)。SGR 2。 — SGR 2 — 暗淡 / 减弱 |
| sitm | enter_italics_mode | \x1b[3m | 斜体。多数现代终端支持,Linux 控制台与 `cmd.exe` 不支持。 — SGR 3 — 斜体 |
| ritm | exit_italics_mode | \x1b[23m | 在不清除其他属性的前提下关闭斜体。 — SGR 3 — 斜体 |
| smul | enter_underline_mode | \x1b[4m | 开启下划线。SGR 4。 — SGR 4 — 下划线 |
| rmul | exit_underline_mode | \x1b[24m | 关闭下划线(SGR 24),其他属性保留。 — SGR 4 — 下划线 |
| blink | enter_blink_mode | \x1b[5m | 慢闪烁。iTerm2 / kitty 等默认关闭;通常体验不佳,建议改用颜色变化。 — SGR 5 — 闪烁(慢速) |
| rev | enter_reverse_mode | \x1b[7m | 反相视频 —— 前景色与背景色对调。SGR 7。 — SGR 7 — 反相显示 |
| smso | enter_standout_mode | \x1b[7m | Standout —— 历史上与反相不同,现代终端统一映射为 SGR 7(反相)。 — SGR 7 — 反相显示 |
| rmso | exit_standout_mode | \x1b[27m | 通过 SGR 27 退出 standout / 反相,仅清除该属性。 — SGR 7 — 反相显示 |
| invis | enter_secure_mode | \x1b[8m | 隐藏文本(SGR 8)。可用于显示掩码密码,但仍可被复制。 — SGR 8 — 隐藏 / 不可见 |
颜色
| tput 能力名 | terminfo 全称 | 序列 | 说明 |
|---|---|---|---|
| setaf | set_a_foreground | varies | 按索引设置前景色。`tput setaf 1` → `\x1b[31m`(红);`tput setaf 9` → `\x1b[91m`(亮红);256 色与 TrueColor 终端接受更高索引。 — SGR 30–37 — 前景色(8 种基础色) |
| setab | set_a_background | varies | 按索引设置背景色 —— `setaf` 的镜像。 — SGR 40–47 — 背景色(8 种基础色) |
| op | orig_pair | \x1b[39;49m | 将前景色与背景色同时恢复为终端默认,不影响其他 SGR 状态。 — SGR 39 — 默认前景色 |
光标
| tput 能力名 | terminfo 全称 | 序列 | 说明 |
|---|---|---|---|
| cup | cursor_address | varies | 将光标移动到 (row, col);terminfo 层 0 索引,最终输出为 1 索引的 `\x1b[<r+1>;<c+1>H`(CUP)。 — CUP — 设置光标位置 |
| home | cursor_home | \x1b[H | 光标回到 (1, 1)。 — CUP — 设置光标位置 |
| cuu1 | cursor_up | \x1b[A | 向上 1 行(CUU 1)。 — CUU / CUD / CUF / CUB — 移动光标 |
| cud1 | cursor_down | \n | 向下 1 行 —— 多数现代 terminfo 中即为 `\n`(LF)。多行使用参数化 `cud`:`\x1b[NB`。 — CUU / CUD / CUF / CUB — 移动光标 |
| cuf1 | cursor_right | \x1b[C | 向右 1 列(CUF 1)。 — CUU / CUD / CUF / CUB — 移动光标 |
| cub1 | cursor_left | \b | 向左 1 列 —— terminfo 通常映射为裸 BS(`\b`,0x08)。多列使用 `cub`:`\x1b[ND`。 — CUU / CUD / CUF / CUB — 移动光标 |
| hpa | column_address | varies | 在当前行移动到指定列 —— `\x1b[<col+1>G`(CHA)。 — CHA — 光标水平绝对位置(列) |
| civis | cursor_invisible | \x1b[?25l | 隐藏文本光标。退出时务必配套 `cnorm`。 — DECTCEM ?25 — 显示/隐藏光标 |
| cnorm | cursor_normal | \x1b[?25h | 恢复文本光标(DECTCEM ?25h)。 — DECTCEM ?25 — 显示/隐藏光标 |
| sc | save_cursor | \x1b7 | 保存光标位置(DECSC)。与 `rc` 配套。 — DECSC / DECRC — 保存与恢复光标 |
| rc | restore_cursor | \x1b8 | 恢复 `sc` 之前保存的光标位置(DECRC)。 — DECSC / DECRC — 保存与恢复光标 |
擦除
| tput 能力名 | terminfo 全称 | 序列 | 说明 |
|---|---|---|---|
| clear | clear_screen | \x1b[H\x1b[2J | 光标归位后清除整个显示区域(ED 2)。shell 命令 `clear` 最终发送的就是它。 — ED — 清屏 (`\x1b[2J`) |
| ed | clr_eos | \x1b[J | 从光标位置擦除到显示区域末尾(ED 0,默认)。 — ED — 清屏 (`\x1b[2J`) |
| el | clr_eol | \x1b[K | 从光标位置擦除到行尾(EL 0)。进度条惯用「`\r` + `el`」。 — EL — 行内擦除 (`\x1b[K`) |
| el1 | clr_bol | \x1b[1K | 从行首擦除到光标(EL 1)。 — EL — 行内擦除 (`\x1b[K`) |
屏幕 / 模式
| tput 能力名 | terminfo 全称 | 序列 | 说明 |
|---|---|---|---|
| smcup | enter_ca_mode | \x1b[?1049h | 进入备用屏幕缓冲。`vim`、`less`、`htop`、`top` 启动时发送它。 — DECSET 1049 — 备用屏幕缓冲 |
| rmcup | exit_ca_mode | \x1b[?1049l | 离开备用屏幕缓冲 —— 恢复原缓冲与光标。 — DECSET 1049 — 备用屏幕缓冲 |
| reset | reset_1string (rs1) | \x1bc | 终端硬重置 —— 发送 RIS(`\x1bc`)。`tput reset` 与 `reset(1)` 最终发送的内容。 — RIS — 重置到初始状态(终端硬重置) |
输入(键盘)
| tput 能力名 | terminfo 全称 | 序列 | 说明 |
|---|---|---|---|
| kcuu1 | key_up | \x1b[A (\x1bOA in DECCKM application mode) | 上方向键。常规光标键模式发 `\x1b[A`;应用通过 `smkx` 打开 DECCKM 后发 `\x1bOA`(SS3)。vim、less 等同时绑定两形。 — CUU / CUD / CUF / CUB — 移动光标 |
| kcud1 | key_down | \x1b[B (\x1bOB in app mode) | 下方向键。DECCKM 切换同 `kcuu1`。修饰键在末字母前以 `;<mod>` 追加:Shift+Down = `\x1b[1;2B`。 — CUU / CUD / CUF / CUB — 移动光标 |
| kcub1 | key_left | \x1b[D (\x1bOD in app mode) | 左方向键。Bash readline 默认把 `\e[D` 绑到 `backward-char` —— 同字节流,只是在输入侧解读。 — CUU / CUD / CUF / CUB — 移动光标 |
| kcuf1 | key_right | \x1b[C (\x1bOC in app mode) | 右方向键。在 `bindkey`/`inputrc` 中与 `kcub1`(左)配对,绑定 `forward-char`/`backward-char`。 — CUU / CUD / CUF / CUB — 移动光标 |
| khome | key_home | \x1bOH (or \x1b[1~ on rxvt-class) | Home 键。xterm 类发 `\x1bOH`(SS3 H);rxvt 类发 `\x1b[1~`。多数 readline 配置同时绑 `\e[H`。 — CUP — 设置光标位置 |
| kend | key_end | \x1bOF (or \x1b[4~ on rxvt-class) | End 键。xterm 类 `\x1bOF`;rxvt 类 `\x1b[4~`。在输入绑定表中与 `khome` 配对。 — CUP — 设置光标位置 |
| kpp | key_ppage | \x1b[5~ | PageUp。`5~` 的 CSI 波浪号编码在 xterm / rxvt / Linux 控制台间通用。修饰键:Shift+PgUp = `\x1b[5;2~`。 |
| knp | key_npage | \x1b[6~ | PageDown。与 `kpp` 镜像,选择子 `6`。Linux 控制台在某些模式下可能发遗留的 `\x1b[G` —— 查 `infocmp linux`。 |
| kbs | key_backspace | \x7f (or \x08 on Linux console / cmd.exe) | 退格。著名分叉:xterm / iTerm2 / Windows Terminal 发 `\x7f`(DEL);Linux 控制台 + cmd.exe 发 `\x08`(BS)。inputrc 中应同时绑两者。 |
| kdch1 | key_dc | \x1b[3~ | Delete 键(向前删,不是退格)。`3~` 选择子。Shift+Delete = `\x1b[3;2~`。勿与 `kbs` 混淆。 |
| kich1 | key_ic | \x1b[2~ | Insert 键。`2~` 选择子。部分模拟器(macOS Terminal)无物理 Insert 键,但仍可由 fn-Enter 或自定义快捷键触发 `\x1b[2~`。 |
| kf1 | key_f1 | \x1bOP | F1。F1–F4 用 SS3 形(`\x1bO` + 字母 `P`/`Q`/`R`/`S`)—— DEC VT100 Help / Do 键的历史遗留。F5+ 改用 CSI 波浪号。 |
| kf5 | key_f5 | \x1b[15~ | F5。带跳号的 CSI 波浪号编码登场:F5=`15~`、F6=`17~`(跳 16)、F7=`18~`、F8=`19~`、F9=`20~`、F10=`21~`、F11=`23~`(跳 22)、F12=`24~`。 |
| kf12 | key_f12 | \x1b[24~ | F12。F 键家族尾端。现代键盘鲜有 F13+ 物理键,但 terminfo 定义到 kf63 —— 按 xterm 传统这些是组合键重映射(Shift+F1 = F13,等)。 |
| smkx | keypad_xmit | \x1b[?1h\x1b= | **进入**应用键盘模式 —— 翻 DECCKM(`\x1b[?1h`)让方向键发 SS3 形(`\x1bOA`..),再 DECKPAM(`\x1b=`)让数字键盘发带 SS3 前缀码。vim / less / fzf 启动时发此串。 — DECKPAM / DECKPNM — 小键盘应用 / 数字模式(ESC = / ESC >) |
| rmkx | keypad_local | \x1b[?1l\x1b> | **退出**应用键盘模式 —— DECCKM 关(`\x1b[?1l`)+ DECKPNM(`\x1b>`)。应用退出时**应当**发此串;vim 崩溃 / 偷懒的 SIGINT 处理器跳过此步会把终端留在应用模式(方向键发 `\eOA` 而非 `\e[A`,破坏 readline 风格输入)。 — DECKPAM / DECKPNM — 小键盘应用 / 数字模式(ESC = / ESC >) |
用法
在任何类 Unix 系统上,`infocmp -1 <term>` 会输出该终端的完整能力表。脚本中使用 `tput <cap>` 会基于 `$TERM` 查询并输出字节,可在 xterm / Linux console / macOS Terminal / kitty / wezterm 间可移植运行,对 dumb 终端也能优雅降级。
# print the underlying escape for any cap:
infocmp -1 xterm-256color | grep -E '^\s(setaf|cup|civis|smcup)='
# emit a cap from a shell script:
RED=$(tput setaf 1)
BOLD=$(tput bold)
RESET=$(tput sgr0)
printf '%s%serror:%s permission denied\n' "$BOLD" "$RED" "$RESET"