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