Windows 终端交错转义序列

问题描述 投票:0回答:1

我正在编写一个跨平台交互式终端程序,用于接收光标查询响应和鼠标事件。 (光标查询实际上是为了检测窗口大小的变化,因为窗口操作通常被禁用。)它在 Linux 中工作正常,但在 Windows 中我得到交错的事件序列,例如:

\x1b\x1b[46;128R[<32;54;17M

这发生在

PowerShell
cmd.exe
中。交错序列似乎总是以
\x1b\x1b
开头,但我觉得这不太令人放心。我可以通过关闭鼠标事件、等待延迟、查询光标、等待另一个延迟以及重新打开鼠标事件来减少交错的发生。但这会降低程序的响应速度,并且仍然无法消除所有发生的情况。

我该如何处理这些交错序列?我可以让 Windows 不交错吗?或者我应该有一个标准的方法来解析交错序列? (这个记录在哪里?)

windows powershell cmd windows-terminal
1个回答
0
投票

我怀疑,这是“\x1b[6n”的问题。
看看linux/windows的区别

按照顺序进行测试

\x1b[1;1H\x1b[6n\x1b[7;7H\x1b[6n
在 Linux 上,响应是:
\x1b[1;1R\x1b[7;7R

在 Windows 上,响应是:

\x1b[7;7R\x1b[1;1R

Linux 只是将查询的答案附加到输入缓冲区的末尾, 但 Windows 将答案(如

\x1b[6n
\x1b[0c
)放在输入缓冲区的前面。

这似乎是错误的,或者至少不是很明智。
而且似乎在某些情况下,如果要插入另一个序列(例如您的鼠标位置),它可能会失败。
当要插入鼠标位置时,报告光标位置答案似乎可能会中断消息,但它不是简单地在前面插入,而是从位置 1 开始。

通过检查两个 ESC 应该可以解决问题,当第二个转义开始有效的

ESC[x;yR
序列时,然后假设您已经获得了下一个序列的 ESC。

© www.soinside.com 2019 - 2024. All rights reserved.