跳到主要内容
ansicode

REP — 重复前一个字符(CSI Pn b)

把上一字符重复打印 N 次 —— 节省同字符长串带宽的小窍门。

字节形式

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

\\x1b[\x1b[Pnb
\\033[\033[Pnb
\\e[\e[Pnb
ESC [ESC [ Pn b
hex1b 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)

示例

bash
# 80-char horizontal rule with minimal bytes:\nprintf '\xe2\x94\x80\033[79b\n'
python
import sys; sys.stdout.write('-\x1b[79b\n')   # 80 dashes
go
fmt.Print("-\x1b[79b\n")
javascript
process.stdout.write('-\x1b[79b\n')
c
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
支持

相关序列