IL — 插入行(CSI Pn L)
在光标所在行打开 N 行空行,把后续行向下推(在滚动区域内)—— vim 'O' 命令的底层原语。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[PnL\\033[
\033[PnL\\e[
\e[PnLESC [
ESC [ Pn Lhex
1b 5b <Pn> 4c说明
Insert Line。末字节 L(0x4c)—— 在光标所在行插入 Pn 行空行(默认 1);活动滚动区域(DECSTBM,默认 = 整屏)内随后的每一行向下推 Pn,会超出下边距的 Pn 行被丢弃。新插入的空行单元携带当前 SGR 背景色。光标移至所在行的第 1 列(ECMA-48 规定列不变,但多数现代终端遵循 xterm 惯例 —— 重置到第 1 列,因为这正是所有 TUI 程序的预期)。用途:vim 的 O 命令(在上方开新行)、tmux 窗格重布局、less 风格的整组向上滚动。逆操作是 DL(\x1b[Pn M)。terminfo 能力名为 il1(Pn=1)或 il(带参数)。
规范出处: ECMA-48 §8.3.67 (IL)
示例
# Set scroll region rows 1..5, position cursor at row 3, insert 2 blank lines.\nprintf '\033[1;5r\033[3;1H\033[2L'import sys; sys.stdout.write('\x1b[2L') # insert 2 lines at cursor rowfmt.Print("\x1b[2L")process.stdout.write('\x1b[2L')printf("\x1b[2L");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- vim, neovim — `O` (open line above) primitive每次 `O` / `o` / `:put!` 在底层都是 DECSTBM 区域内光标所在行的 `\x1b[1L` —— 编辑器复用终端原生的插入行能力,避免重绘光标下方每一行
- less, more — scroll-up by N向上回滚长文件时,在页面区域第 1 行发出 `\x1b[<N>L` —— 底部 N 行被推下边界,新的顶部行随后写入空出的位置
- tmux — pane resize / split-window redraw纵向扩大窗格时,在新窗格的 DECSTBM 区域内用 IL 腾出空间,避免周围窗格被强制整屏重绘 —— `tmux send-keys` 基准显示比整屏重写少约 10 倍字节
- ncurses — `insertln()` / `winsertln()`libncurses 的 `insertln(WIN)` 直接映射到 terminfo 能力 `il1`(无 Pn)或 `il`(带 Pn)—— 基于 ncurses 的 TUI(htop、vifm、mc、weechat)只要底层终端导出该能力就免费获得 IL
- git diff --color-moved=zebra inside `less -R`git diff `--color-moved=zebra` 在 `less -R` 中产生的斑马纹之所以工作,正是因为 `less` 在 DECSTBM 区域内用 IL + DL 对来铺排移动块 —— 交错铺出深浅背景而不波及未变化的上下文
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
\x1b[L是插入一行还是滚屏?- 插入。IL(
\x1b[Pn L)在光标所在行打开Pn行空行,并把后续行在活动滚动区域内向下推 —— 区域顶部不滚动,光标之上的内容不丢失。被推出滚动区域底部(由decstbm设定)的行被丢弃;若未设滚动区域,底部行落出可视屏幕。这是 vim / neovim 实现O与o命令的底层原语;用\n自己撸等于复现 ed(1) 自带的 bug。 - IL 与滚动区域(DECSTBM)如何交互?
- IL 仅在光标位于活动滚动区域*内*时生效。若光标在顶边距之上或底边距之下,多数终端(xterm、kitty、alacritty、wezterm、ghostty)将 IL 视作空操作 —— 你的绘制会静默失败。在区域内,行向底边距推,越过边距的行被丢弃。可移植模式:设 DECSTBM(
\x1b[<top>;<bottom>r)→ 用 CUP 把光标移入 → 发 IL → 完成后用\x1b[r(默认全屏)复位 DECSTBM。相关的光标行 off-by-one 陷阱见alt-screen-newline误区条目。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
相关序列
在家族食谱中
CSI 食谱 · 6. 插入 / 删除 / 光标形状 —— IL / DL / ICH / DCH / ECH + DECSCUSR