所以我正在编写一个终端仿真(我知道,我应该编译 putty 等),并且正处于通过 vttest 进行缓慢工作以确保其正确的阶段。我目前以 VT102 为基础,但当基础功能正常运行时,我将添加稍后的终端功能,例如颜色。
命令集主要是 ANSI。 DEC 有自己的命令集,但从 1973 年左右开始支持 ANSI 命令。这些 ANSI 标准现在显然不可用,但 ECMA 等效标准是,我有它们(ECMA-48 似乎最相关),但据我所知,没有回答这个问题可以看到。大多数 ANSI 命令序列以 ESC 开头。许多命令以此处显示为 CSI 的命令序列标识符开头,并在数据中表示为 0x1c 0x5b (ESC [
),如果可以进行 8 位通信,则表示为 0xdb。然后是识别命令的序列。有些命令影响光标位置,有些命令影响屏幕,有些命令会引起对主机的响应等等。
某些终端命令包含数字参数。示例CSI 10 ; 5 H
表示将光标置于第 10 行第 5 列。当缺少数字参数时,可以使用默认值:CSI 10 ; H
表示将光标置于第 10 行第 1 列,因为未给出参数时 1 是默认值。
我有来自 vt100.net 的 vt102 手册(很棒的资源)和大约十几页,提供了有关这些命令序列的部分信息。显然,完整的福音 DEC 终端规范从未从 DEC 中诞生。
明确的是,CSI C
将光标向右移动,默认值为 1。
尚不清楚的是 的含义是什么CSI 0 C
。
为什么那里有一个零,它看起来会让命令什么都不做?如果它的意思是“使用默认值”,那么它可以作为 1 发送,但较短的字符串将没有参数,并且无论如何都依赖于被解释为 1 的默认值。这些实际的物理 VT 终端通常以 300 波特及以下速率使用,因此一个字符确实很重要!
我对 vttest 还没有那么先进,我可以尝试两种方法,看看哪种方法能让一切变得完美,但我已经足够了,像这样的小问题开始变得重要了。
答案1
我联系了维护 xterm 和 vttest 的 Thomas Dickey (invisible-island.net) - 他解释说这与 xterm 中的或CSI 0 C
相同。CSI 1 C
CSI C
对于任何寻找有关终端编程的更多信息的人,我强烈建议您查看他托管的 xterm 源代码 - 特别是 xterm 内的 ctlseqs.txt,它看起来非常像我一直在寻找的真正的终端控制序列参考。
答案2
当您已经拥有将功能映射到许多不同终端的特定代码序列的数据库时,为什么还要对特定终端类型的兼容性进行硬编码? (terminfo 数据库通常位于 /usr/share 中,并且包含在大多数 ncurses 发行版中)。任何有关curses 的资源都应该解释这些函数的标记方式。
请注意,terminfo 文件通常是编译的(使用 tic),因此您可能需要深入挖掘才能找到 terminfo 源文件。
也可以看看http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16(他们中有一个 terminfo.src 文件存储库的链接)