ANSI 转义 0x1b[0A 和其他 0 值代码应该做什么?

ANSI 转义 0x1b[0A 和其他 0 值代码应该做什么?

我正在为 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+ 兼容仿真器是否完全符合规范。

相关内容