返回

文章详情

无处可逃:ANSI 代码的探索

Hacker News2026年6月5日 07:02

2025年12月22日 · 阅读时间4分钟 · 作者:Safia Abdalla ANSI转义代码有点疯狂,不是吗?我的意思是,从某种意义上来说,它们是如此简单且持久的概念。每当你的终端渲染粗体红色文本或进度条在屏幕上爬行时,你正利用一个近50年的标准。我不是最大的计算机历史爱好者,但我认为理解和欣赏这些标准可以让我们更好地理解我们的行业,并感受到我们今天建立的标准如何能在未来五十年的计算中扩展。考虑到这一点,让我们深入了解ANSI转义代码。它们是如何工作的 在我作为地球上一个物理概念存在之前,终端是物理设备:CRT显示器通过串行电缆连接到主机。这些“傻终端”只能显示文本,其他则没什么用处。确立ANSI转义代码的标准是对这种媒介局限性的反应。普通文本是唯一可用的传输格式,这些终端只能逐个字符处理文本流。该标准描述了一种格式,允许文本流为终端编码额外的行为:控制光标位置、文本格式和颜色的能力。终端接收的文本流可能包含代表这些ANSI代码的特殊字符序列。现代终端模拟器逐字符读取流,当它遇到转义序列时,会将其解释为命令而不是显示它。ANSI转义序列以ESC字符(ASCII 27,或十六进制中的\x1b)开头,后跟左括号[,形成所谓的控制序列引导器(CSI)。之后是实际的命令。例如:\x1b[31m将文本颜色设置为红色 \x1b[1m使文本加粗 \x1b[0m重置所有格式 \x1b[2J清除整个屏幕 \x1b[H将光标移动到左上角 你可以通过用分号分隔多个属性来进行组合。所以\x1b[1;31m给你粗体红色文本。末尾的m是选择图形渲染(SGR)命令,用于处理所有样式相关的内容。原始规范定义了8种颜色(黑色、红色、绿色、黄色、蓝色、品红色、青色、白色),但现代终端已经大大扩展了这一点。256色模式使用像\x1b[38;5;208m这样的代码来表示扩展颜色。真正的24位颜色支持看起来像\x1b[38;2;255;128;0m,表示RGB值。 它们为何重要 一个来自1979年的标准至今仍然是我们与CLI互动的基础。当你看到命令的彩色输出或在执行长时间运行的命令时看到进度指示器时,那就是ANSI代码在发挥作用。如果你为你的shell设定了自定义提示符,你也利用了这些ANSI代码来设置背景和前景颜色。ANSI代码是如此持久的标准,以至于它们得到了现代的更新。像在.NET中的Spectre.Console或Node中的chalk等包公开了与用户自定义应用程序中的这些ANSI代码交互的助手。它们中的许多提供了超复杂的(好吧,与1979年的情况相比)模式,通过使用光标移动和重写来实时编辑内容,以渲染旋转器和跳动器。如果你使用过aspire deploy命令,你可以看到这些模式是如何组合成相当多彩和互动的用户界面的。你可以在我早期的帖子中阅读更多关于这方面的内容。甚至更花哨的终端用户界面,比如Vim和htop,进一步扩展了ANSI代码的光标定位和屏幕操作,提供了全屏互动体验。它们利用像\x1b[10;20H这样的序列来指示光标应该如何移动。在这种情况下,数字表示光标应该移动到第10行、第20列。结合清除行和绘制字符的能力,你可以仅使用文本流构建出令人惊讶的复杂接口。自己试试看 我在下面构建了一个小的互动小部件,你可以在其中尝试不同的转义序列,看看它们如何实时渲染。你可以看到字体样式、前景和背景颜色以及光标移动如何导致不同的ANSI转义代码。下次你在欣赏多彩的终端输出时,你会确切知道是什么咒语让它发生。 附言:这篇博客文章在很大程度上是一个借口,以展示上面的这个小互动用户界面。作为一个序列后端小怪物(头韵与双关语?不真实!),我正在尝试通过构建这样的小学习互动来提升我的设计品味。我终于有机会在构建这个过程中玩弄Tailwind,感觉相当有趣。坦白说,人工智能在这里编写了大部分代码。我所做的主要是弄清楚体验应该是什么样子。如果这明显看起来像是一个大多数时间都在注视文本的人构建的东西,请告诉我。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡