如果实现终端模拟器,支持什么类型的终端?

如果实现终端模拟器,支持什么类型的终端?

我听说VT100是事实上的标准。这是否意味着如果我只支持 VT100,然后我的终端就可以适用于现有的命令行应用程序而不会出现大问题?如果没有,如何确保该终端实用?有什么参考可以帮助实现这个目标吗?

答案1

你快要让托马斯·迪基过热了。

忽略多年来流传的有关 VT10x 终端的地下资料。其中大部分都是错误的。 DEC VT100、VT101 和 VT102 实现了一组非常具体的功能,可以通过阅读其 doco 来了解这些功能。

那是不是然而,那些错误地混淆这些术语vt100vt102实际含义的人是什么?通常,他们谈论的是可以做很多事情的终端仿真更多的比真正的 VT10x 所做的,以及很多较少的。例如,真正的 DEC VT102 有一个附加的串行打印机以及用于访问它的控制序列。它还做到了不是有许多来自后来的终端仿真器和真实终端的控制序列,人们错误地将其归因于“vt102”。例如,它没有 SGR 颜色变化的概念。

您有两个基本选择:

  • 实现与 termcap/terminfo 数据库中定义的现有终端类型兼容的内容。如果您这样做,则必须正确执行,准确复制所有现有终端类型的描述行为。 (nosh 工具集的终端仿真器可以执行此操作,在 Linux 上模拟linux终端类型。它必须复制linux终端类型的奇特且有限的扩展键和功能键编码。)
  • 实现您自己的终端类型,其行为由您设计,然后您必须将其包含在 termcap/terminfo 数据库中。严格来说,PuTTY 终端仿真器就是执行此操作的。正确的 terminfo 描述是 putty,putty-256color, 或者putty-sco

对于前者,什么是标准是无关紧要的,因为无论它多么不标准,你都必须复制所描述的行为。对于后者,不要寻找事实上的标准。看着那(这实际的标准,其中一些自 1976 年以来就已经存在。

  • ECMA-48(首次发布于 1976 年,后来被采纳为 ISO/IEC 标准,ISO/IEC 6429)描述:
    • C0 控制代码,
    • C1 控制代码(鲜为人知,但处理一些有用的事情,例如设置/清除制表位和前进/后退索引)
    • 所有 C1 控制代码的 7 位别名(例如,ESC[实际的8位控制字符U+009B),
    • CSI 引入的控制序列(标准中有一个通用语法,许多 samizdat 编写的控制序列解析器都会出错),
    • 以及很多其他的东西。
  • ISO/IEC 2022 描述了 7 位字符集之间的切换。如果您打算从一开始就实现 UTF-8 功能,那么最好完全忽略 ISO/IEC 2022,正如 Markus Kuhn 及其发明者mosh将告诉您的那样。
  • ISO/IEC 8613-6(1989 年发布,1994 年修订)描述了颜色 SGR 控制序列的 ECMA-48 扩展,包括从调色板中选择“索引颜色”和“直接颜色”RGB。 (两个都直接颜色索引颜色在 ISO/IEC 8613-2 中定义。您可能会通过地下出版物名称“256 色”了解后者。)

    重要的提示: 几乎所有的实现都错误地实现了这一标准,因为它们是根据地下资料(或简单地相互复制)而不是根据实际标准工作的。该标准在§13.1.8中规定使用冒号(:,“3/10”)作为子参数分隔符;几乎所有实现都错误地使用分号 ( ;),从而引入解析歧义。许多软件都已解决此错误。

进一步阅读

相关内容