DECSTBM — 设置上下边距(CSI r)
定义垂直滚动区域 —— 区域外的行被固定,区域内的行参与滚动。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[T;Br\\033[
\033[1;24r\\e[
\e[1;24rESC [
ESC [ T ; B rhex
1b 5b <T> 3b <B> 72说明
Set Top and Bottom Margins。末字节 r(0x72);参数是基于 1 的行号 —— T(顶部行,默认 1)与 B(底部行,默认 = 屏幕高度)。一旦设置,所有滚动行为 —— 底行自然溢出、B 之后的 LF、SU/SD(\x1b[NS/T)以及备用屏幕 —— 都只作用于第 T..B 行(含端点);T 之上与 B 之下的行被固定。发送 \x1b[r(无参数)恢复整屏滚动。DECSTBM 执行后光标会被移到活动区域的原点(左上角)。每个全屏 TUI 都用它把状态栏(第 1 行或第 N 行)冻结,仅让正文滚动。结合 DECOM(?6h/l)可让光标定位也被裁剪到该区域。
规范出处: xterm-ctlseqs (DECSTBM, CSI Ps ; Ps r)
参数
| T | 顶部行,基于 1(默认 1) |
| B | 底部行,基于 1(默认 = 屏幕高度) |
示例
printf '\033[2;23r' # rows 2..23 scroll; 1 and 24 pinned\nprintf '\033[r' # reset to full screenimport sys; sys.stdout.write('\x1b[2;23r')fmt.Print("\x1b[2;23r")process.stdout.write('\x1b[2;23r')printf("\x1b[2;23r");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- tmux, GNU screen用 DECSTBM 把滚动区域圈在主体,把底部状态行排除在外 —— 状态栏钉住不动,窗格在切出的区域内滚动
- vim, neovim split windows每个窗口发自己一对 top / bottom 行号的 DECSTBM,`<C-d>` / `<C-u>` 只滚动该分割窗,不影响整个终端
- htop, btop, glances dashboards标题 / 底栏排除在滚动外;进程 / 图表区域在 DECSTBM 内滚动,标题在每次重绘中保留
- less, more — reserved status line底部 `:` 提示行通过 DECSTBM 从滚动中切出 —— `j` / `k` 滚动从不覆盖分页器状态行
- ncurses setscrreg(3X) / wsetscrreg(3X)curses 滚动区域 API 在窗口等于整个终端时 1:1 对应到 DECSTBM —— 基于 curses 的 TUI 库免费继承 DECSTBM 语义
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |