某些程序如何设置背景和字体颜色,将字符多次写入屏幕上的同一位置(例如第三行,第五列)?
curl google.com > a
一些示例是由、一些安装屏幕和几乎所有文本编辑器显示的进度条。
答案1
你问的并不是真正的图形API,它只是终端控制字符。
它背后有很多历史,但当时的终端是电传打字机机器。基本上是一台带有轨道送纸的打字机,通过串行连接连接到计算机。键入一个字符会将二进制值发送到计算机(以及在页面上键入它)。计算机将打印回字符作为您所请求的任何内容的输出。
特殊字符用于控制终端(这是控制键的来源,它用于产生这些字符)。例如,^H
或^?
是退格键,^M
是回车符(将光标移动到行首),^J
是换行符(将页面向上移动一行)。一些控制代码在 C 中具有转义序列(几乎所有编程语言都共享)来生成控制字符。前面列出的控件分别是\b
、\r
。\n
这终端仿真器您今天使用的软件就像听起来一样,它伪装成一台旧的电传打字机。在某种程度上,就好像 Unix 仍然认为您正在使用打字机与其进行通信一样。
在 的情况下curl
,它会写入整行,然后发送\r
(回车)将光标移至该行的开头,然后写入另一行。由于未发送换行符,因此它会继续在屏幕上的同一行上写入。
您可以尝试通过以下方法来证明这一点:
echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
您将看到打印出“First”一词(但不会发送新行)。 5 秒后,它将被单词“Second”替换,并发送新行。您可以无限期地重复此模式。尝试自己添加“第三”,您会看到一些您可能没有想到的东西;-)
有关这些和其他控制字符的更多信息,请参阅ascii(7)
手册。
答案2
你在寻找类似的东西吗恩诅咒?
答案3
这个问题实际上是几个问题,并且“控制字符”仅解决其中的一小部分,例如 的进度条curl
。更一般地说,这些是终端(和终端仿真器)的共同特征。
大多数这些共同特征都已标准化ECMA-48:编码字符集的控制函数。然而,其他功能是不是。它们是实现定义的。
ECMA-48 指的是控制功能。包括控制字符和控制序列(通常称为转义序列、ANSI 序列等)。
一些控制字符用于简单的操作,例如
- 将光标移动到同一行的上一列
- 将光标移动到同一行的第一列
- 将光标移动到同一行的下一个制表位
- 将光标移动到下一行(并滚动屏幕如果已经在最后一行了)
进度条curl
是使用这些简单的操作构建的。但控制字符只能做这么多,仅此而已。控制序列可以做更多的事情,例如,
- 将光标移动到屏幕上的任意行/列
- 将光标移动到屏幕上同一列的任意行
- 将光标移动到屏幕上同一行的任意列
- 在屏幕上的任意列设置制表位
- 将光标移至上一行
- 使屏幕向上或向下滚动而不移动光标
简单/复杂之间的相似之处就这么多。控制序列还用于更改文本和背景的颜色、从屏幕上删除文本、以反白方式显示文本(或粗体、下划线、闪烁)。
绘制反向视频(或彩色)进度条的程序控制序列。
尽管控制序列可以做更多的事情,但它们只能做特定的事情。将它们放在一起来制作文本编辑器、安装屏幕(以及绘制彩色进度条的程序)会变得很复杂。通过使用了解这些事情的库可以使其中一些变得更简单。最初,我们有 termcap(以及数百种终端的数据库),扩展到 terminfo(以及大约一千种终端的数据库)。
即使采用标准化,您也可以使用数十种终端描述使用。因此,除了最琐碎的应用程序之外,我们继续将库用于所有应用程序。一种是 ncurses(“new-curses”),另一种是 slang(技术上是“S-Lang”)。
进一步阅读: