跳到主要内容
ansicode

ICH — 插入字符(CSI Pn @)

把当前行剩余内容右移 N 格并以空白填充间隙 —— vim 插入模式的底层原语。

字节形式

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

\\x1b[\x1b[Pn@
\\033[\033[Pn@
\\e[\e[Pn@
ESC [ESC [ Pn @
hex1b 5b <Pn> 40

说明

Insert Character。末字节 @(0x40)—— 在当前行内,把光标位置及其右侧每个单元向右移动 Pn 格(默认 1);越过右边界的单元被丢弃,光标处出现 Pn 宽的间隙,用空格(SP,0x20,携带当前 SGR 背景色)填充。光标位置不变。ICH 是 vim 插入模式每键一击发送的底层原语 —— 不使用 ICH 就得为每次击键重绘整行,使用后屏幕更新降为每字符 O(1)。与 DCH(\x1b[Pn P)成对(删除)。ICH 受右边距(若设定了 DECSTBM 列边距)约束 —— 右边距外的单元不会被推入。terminfo 能力名为 ich1(Pn=1)或 ich(带参数)。

规范出处: ECMA-48 §8.3.64 (ICH)

示例

bash
# Move cursor to column 5, insert 3 cells, then type 'xyz' (it lands at col 5).\nprintf 'Hello world\033[5G\033[3@xyz'
python
import sys; sys.stdout.write('\x1b[3@')   # open a 3-cell gap at the cursor
go
fmt.Print("\x1b[3@")
javascript
process.stdout.write('\x1b[3@')
c
printf("\x1b[3@");

在哪里用到

实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。

  • vim insert-mode `i` / `I` / `a` primitives`'insertmode'` 重绘为局部时 vim 对行内字符插入发 ICH —— 行尾内容右移、所插字符占光标单元。`:set verbose=15` 在快速键入期间可见 `<Esc>[<N>@` 模式
  • bash readline `quoted-insert` (Ctrl-V)readline 的 `quoted-insert` 绑定在光标处插入字面控制字符,字节写入前先发 ICH —— 在不回落到整行重绘的前提下,保留行尾的列位置以便行内编辑
  • zsh ZLE `self-insert` widgetzsh 行编辑器在 `INSERT_MODE` 开启且光标不在行尾时发 ICH —— 行尾整齐右移一字符,仅用单条 CSI 字节而非整行内容重绘
  • less / more search-marker highlight insertionless ≥ 633 在光标处用 ICH 插入 `>` 搜索标记,再应用高亮 SGR —— 在搜索命中区域内保持行已有内容布局,同时让标记视觉上把其余内容右推一格
  • ncurses `insch()` / `winsch()`ncurses `insch()` 在公告 `ich1` 能力的终端上映射到 `\x1b[1@`(ICH 默认 1),其他终端经 `ich` 映射到参数化 `\x1b[<N>@` —— `infocmp xterm-256color | grep ich` 可见

常见问题

针对这条序列,开发者真正会去搜索的问题的简短回答。

ICH(\x1b[5@)和 IL(\x1b[5L)的区别?
ICH(Insert Character —— 末字节 @,0x40)在当前行光标处插入 Pn 个空白单元,把本行后续内容右移 Pn 位;右移出右边距的单元丢失。IL(Insert Line —— 末字节 L,0x4c)在光标所在行插入 Pn 个空白*行*,把后续行在滚动区域内向下推。ICH 对应 vim 单字符 i;IL 对应 vim 的 Oo。行内编辑选 ICH,行级插入选 IL。
ICH 把右边距外的字符推到哪里去了?
丢弃 —— 被推出行外永久消失。ICH *不会*把被推出的内容换行到下一行(那是行重排,是另一个概念 —— 参 DECAWM \x1b[?7h)。右边距外的尾部单元被直接截断。ICH 触发时若光标已越过右边距(只有 DECAWM 处于「待换行」中间态时可能),行为由实现决定 —— xterm 视为空操作,kitty 与 Ghostty 先把光标换行再插入。

终端支持

xterm
支持
Linux console (fbcon)
支持
macOS Terminal.app
支持
iTerm2
支持
Windows Terminal
支持
cmd.exe / ConPTY
部分
kitty
支持
alacritty
支持
WezTerm
支持
Ghostty
支持
GNOME Terminal
支持
Konsole
支持
tmux
支持
GNU screen
支持

相关序列

在家族食谱中

CSI 食谱 · 6. 插入 / 删除 / 光标形状 —— IL / DL / ICH / DCH / ECH + DECSCUSR