终端的图形API是什么?


8

某些程序如何设置背景和字体颜色,将字符多次写入屏幕上的同一位置(例如,写入第三行,第五列)?

一些示例是,显示的进度条curl google.com > a,一些安装屏幕以及几乎所有的文本编辑器。

Answers:


5

您要问的实际上不是图形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)手册。



1

该问题实际上是几个问题,“控制字符”仅解决了其中的一小部分,例如的进度条curl。更一般地,这些是终端(和终端仿真器)的共同特征。

这些常见功能中的大多数已在ECMA-48:编码字符集的控制功能中标准化。但是,其他功能不是。它们是实现定义的。

ECMA-48是指控制功能。其中包括控制字符控制序列(通常称为转义序列,ANSI序列等)。

一些控制字符用于简单的操作,例如,

  • 将光标移到同一行的上一列
  • 将光标移到同一行的第一列
  • 将光标移到同一行的下一个制表位
  • 将光标移动到下一行(如果已经在最后一行上,滚动屏幕)

curl使用这些简单的操作即可构建的进度条。但是控制角色只能做很多事情,不能做更多。控制序列的作用更大,例如

  • 将光标移动到屏幕上的任何行/列
  • 将光标移动到屏幕上同一列中的任何行
  • 将光标移动到屏幕上同一行的任何列
  • 在屏幕上的任何列上设置制表位
  • 将光标移到上一行
  • 使屏幕向上或向下滚动而不移动光标

简单/复杂之间的相似之处太多了。控制序列还用于更改文本和背景的颜色,从屏幕上擦除文本,以反向视频(或加粗,下划线,闪烁)显示文本。

绘制反向视频(或彩色)进度条的程序使用控制序列

尽管控制序列可以做更多的事情,但它们只能做特定的事情。将它们组合在一起以使文本编辑器,安装屏幕(以及绘制彩色进度条的程序)变得复杂。通过使用了解这些内容的库,可以简化其中一些操作。最初,我们使用termcap(以及一个包含数百种终端的数据库),并扩展到terminfo(以及一个包含大约一千种终端的数据库)。

即使有了标准化,您仍然可以使用许多终端说明。因此,我们继续将库用于这些应用程序中最琐碎的部分。一个是ncurses(“ new-curses”),另一个是语(技术上是“ S-Lang”)。

进一步阅读:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.