如果实现终端仿真器,要支持什么类型的终端?

V.D*_*D.D 2 terminal-emulator terminal

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

Jde*_*eBP 12

你会让托马斯·迪基过热。

忽略已经流传多年的关于 VT10x 终端的 samizdat。很多都是错误的。DEC VT100、VT101 和 VT102 实现了一组非常具体的功能,可以通过阅读他们的 doco 来学习。

然而,这并不是那些错误地围绕这些术语vt100vt102实际上意味着什么的人。通常情况下,他们所谈论的是,做了一大堆的终端仿真比什么是真正的VT10x做了,还有一大堆。例如,一个真正的 DEC VT102 有一个连接的串行打印机,以及用于访问它的控制序列。此外,它也没有具有许多控制序列的从后终端模拟器和真正的终端,人们错误地归咎于“VT102”。例如,它没有 SGR 颜色变化的概念。

您有两个基本选择:

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

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

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

    重要提示: 几乎所有的实现都错误地实现了这一标准,因为它们是从 samizdat(或简单地相互复制)而不是从实际标准工作的。标准在 §13.1.8 中说使用冒号 ( :, "3/10") 作为子参数分隔符;几乎所有的实现都错误地使用了分号 ( ;),从而引入了解析歧义。很多软件都适应了这个错误。

进一步阅读

  • 大多数需要高级 TTY 控制的命令行应用程序不会自己实现它,而是使用一个库来处理实际的控制代码。历史上,这个库被称为“curses”;现代版本是`ncurses`。这些库使用“终端描述”来标识特定终端类型中可用的所有功能。终端描述来自`terminfo` 数据库(现代)或`/etc/termcap` 文件(经典)。因此,如果您实现新的终端类型,您还应该为其编写描述并将其安装到您的系统中。 (2认同)