我正在为 jQuery Terminal 编写 ANSI 格式化代码。它几乎可以工作,但我有一个问题,它与应该移动光标的 0A ansi 代码有关(还有其他 0 光标代码:BCDEF)
我测试过埃维图书馆\x1b\[0[A-D]
如果我在输出到终端之前从字符串中删除,则会产生影响。
我不确定是否正确处理 ANSI 转义,我在每行之前将输出分成几行,我增加 y 位置并将 x 设置为 0,当存在光标 ANSI 转义代码时,我移动光标。我使用数组数组来保存屏幕的输出。 (不确定,但我认为如果我不将这些行连接到一个字符串中直到最后,它会更快,但我这样做是因为这是第一个想法而不是因为速度)。
我不确定如果有0我应该做什么。
这是 ervy 库中两个图的输出
正确的情节
没有零代码的绘图。
我正在尝试调试我的代码(我认为在某一点上绘图会显示在第二个屏幕上),但我不知道如何处理 0 ANSI 转义码。
我在用着维基百科作为参考。
答案1
这些转义序列采用重复计数作为参数,例如\e[5A
将光标向上移动 5 行,\e[10C
将光标向右移动 10 列等。该值,如果省略,默认为 1。
但是如果参数显式指定为 0 会发生什么情况呢?
我们来看看标准。 ECMA-48 以及 ctlseqs.html(记录 xterm 的行为)对此没有任何说明,也就是说,隐含地暗示它们应该移动零。另一方面,DEC STD 070 规定 0 值应该移动 1。
让我们看看实现。对于其中一些序列,urxvt 将 0 解释为 0,例如对于垂直光标移动,但对于水平光标移动则不然(那里是 1)。我检查过的所有其他终端都将其解释为 1(包括 xterm,因此其行为和文档不匹配)。
标准不一致。实施不一致。
你能做什么?不要使用这些。如果您遇到发出这些错误的库,请提交错误并要求其开发人员停止使用这些有问题的转义序列,因为无论他们期望什么,它都违反了某些标准,并且肯定会破坏某些终端。
答案2
考虑到 ZDM(零默认模式),DEC VT 中的行为更容易理解。来自 ECMA-48:
参数值 0 表示默认参数值,可以与 0 不同。
对于光标移动序列,规范将默认值定义为“1”,因此这些在 ZDM 中都是相同的:
CSI A
(省略参数默认为1)CSI 0 A
(0有默认值的特殊含义)CSI 1 A
(param恰好是默认值)
据我所知,DEC 设备中实现的所有 CSI 序列都遵循 ZDM 方案。
后来 ZDM 从规范中删除,因此“0”现在应该读取为数字,而不是再作为默认值的特殊占位符。但 DEC 设备并没有改变这种行为。因此,这归结为一个问题:VT100+ 兼容仿真器是否完全符合规范。