REP — 重复前一个字符(CSI Pn b)
把上一字符重复打印 N 次 —— 节省同字符长串带宽的小窍门。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[Pnb\\033[
\033[Pnb\\e[
\e[PnbESC [
ESC [ Pn bhex
1b 5b <Pn> 62说明
Repeat Preceding Character。末字节 b(0x62)—— 把最近一个图形字符(即更新过终端显示的字符,不计控制码与空白)再打印 Pn 次(默认 1)。若上一字节是控制码或尚无字符,REP 为空操作。在窄 SSH 链路下很有用:画一条 80 个 ─ 的横线,直接写需要 80 个多字节 UTF-8(160–240 字节);写成 ─\x1b[79b 仅 5 字节字符 + 4 字节控制码 = 9 字节。xterm(自 X11R5)、kitty、wezterm、ghostty、alacritty、mintty、foot 都支持;Windows Terminal 1.18+ 添加支持;iTerm2 不支持。发送装饰性方框字符或进度条填充的程序可在使用前用 XTGETTCAP 探测 rep 能力。terminfo 能力名为 rep。
规范出处: ECMA-48 §8.3.103 (REP)
示例
# 80-char horizontal rule with minimal bytes:\nprintf '\xe2\x94\x80\033[79b\n'import sys; sys.stdout.write('-\x1b[79b\n') # 80 dashesfmt.Print("-\x1b[79b\n")process.stdout.write('-\x1b[79b\n')printf("-\x1b[79b\n");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- ANSI horizontal-rule emitters (CLI banners)形如 `printf '\xe2\x94\x80\033[$((COLUMNS-1))b\n'` 的 bash 一行画满宽方框规则线,字节数 O(1) 不随终端宽度变化 —— `gh pr view --comments`、`glab issue view` 和大多数现代 CLI 以此替代 `seq` + `printf` 循环
- neovim screen redraw (when `set lazyredraw`)neovim 把缓冲区更新批处理,redraw 刷新时对相同字形长串(空白填充、未绘制窗格占位)发 REP —— 在 `:set verbose=20` 跟踪中可见 `<Esc>[ Nb` 簇
- fastfetch / neofetch ASCII art renderer发行版 logo ASCII 渲染用 REP 压缩同色块字符(`█`)的长串 —— 在公告 `rep` 能力的终端上,60×40 logo 从 ~12 KB UTF-8 缩到 ~3 KB;否则回落到字面输出
- less progress bar / file-size column paddingless ≥ 600 用 REP 在文件大小列偏窄时给底行 `:` 提示填空格 —— 在 200 列终端上,`\033[<N>b` 让每次状态更新的屏幕重绘字节数控制在 50 以内
- Windows Terminal 1.18+ test pattern generator微软 `wt` 启动的测试图样 UI(Settings → Render → Test pattern)发出大量 REP 渐变以验证渲染器批处理 —— 1.21 一个破坏真彩单元 REP 的回归正是被这套夹具捕获
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- REP(
\x1b[Pn b)重复的是最近一个控制序列、最近一个字节,还是最近一个可打印字符? - 严格是最近一个*图形字符* —— 即更新过终端显示的字符。控制码(CR、LF、BS)、SGR 序列、光标移动与空白都跳过;若尚未发出任何图形字符,REP 为空操作。
printf '─\033[79b'打 80 个─;printf '\033[31m\033[79b'(SGR 后接 REP,中间无图形字符)什么都不打。规范原文 ECMA-48 §8.3.103:「REP 令前一个图形字符被重复」。 - 为什么 macOS Terminal / iTerm2 不支持 REP?
- Apple 的 Terminal.app 与 iTerm2 是 REP 普及前构建的 VT100 系模拟器 —— REP 是 xterm 扩展(自 X11R5)而 VT100 未定义。Apple 解析器把末字节
b路由到空操作而非 REP 处理器,所以\x1b[5b什么都不打而非重复。可移植模式:启动时用XTGETTCAP rep(\x1bP+q726570\x1b\\)探测,缺失时回落到字面循环printf '─' x 80。现代终端(kitty、wezterm、Ghostty、foot、alacritty、mintty、Windows Terminal ≥ 1.18)均实现;Linux console 也实现(经内核console_codes(4)VT 子集)。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 不支持 | 不支持 | 支持 | 不支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 |