Answers:
您要问的实际上不是图形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)
手册。
该问题实际上是几个问题,“控制字符”仅解决了其中的一小部分,例如的进度条curl
。更一般地,这些是终端(和终端仿真器)的共同特征。
这些常见功能中的大多数已在ECMA-48:编码字符集的控制功能中标准化。但是,其他功能不是。它们是实现定义的。
ECMA-48是指控制功能。其中包括控制字符和控制序列(通常称为转义序列,ANSI序列等)。
一些控制字符用于简单的操作,例如,
curl
使用这些简单的操作即可构建的进度条。但是控制角色只能做很多事情,不能做更多。控制序列的作用更大,例如
简单/复杂之间的相似之处太多了。控制序列还用于更改文本和背景的颜色,从屏幕上擦除文本,以反向视频(或加粗,下划线,闪烁)显示文本。
绘制反向视频(或彩色)进度条的程序使用控制序列。
尽管控制序列可以做更多的事情,但它们只能做特定的事情。将它们组合在一起以使文本编辑器,安装屏幕(以及绘制彩色进度条的程序)变得复杂。通过使用了解这些内容的库,可以简化其中一些操作。最初,我们使用termcap(以及一个包含数百种终端的数据库),并扩展到terminfo(以及一个包含大约一千种终端的数据库)。
即使有了标准化,您仍然可以使用许多终端说明。因此,我们继续将库用于这些应用程序中最琐碎的部分。一个是ncurses(“ new-curses”),另一个是语(技术上是“ S-Lang”)。
进一步阅读:
ncurses
。