gpt4 book ai didi

windows - ANSI 转义序列不会打印到 Windows 上的标准输出

转载 作者:可可西里 更新时间:2023-11-01 09:53:08 28 4
gpt4 key购买 nike

我正在尝试在 Windows 上使用 node.js 将 ANSI 转义序列写入标准输出,但它似乎不起作用。

具体来说,我使用 ConEmu哪个support一个子集 ANSI 代码。我创建了一个测试文件,它应该重命名当前的控制台选项卡:

process.stdout.write('\x1b]9;3;"abc"\x1b\x5c');

但是,当我运行它时没有任何反应。如果我运行 node test > out.txt,正确的字节将写入输出文件。

为什么转义序列不起作用?

最佳答案

当 Node 的标准输出连接到非交互式接收器(即通过管道或重定向到文件)时,写入 process.stdout 的字节将按原样写入。因此,运行 node test > out.txt 会产生预期的结果。

但是,当 Node 连接到 Windows 中的交互式终端时,它(通过 libuv)实际上是 parses all ANSI escape codes这样它就可以使用 Windows API 透明地模拟 unix TTY 终端。这就是使颜色和重新定位光标等功能在 Windows 中起作用的原因,因为 Windows 控制台不支持 ANSI 转义序列。

未知和不受支持的序列被静默忽略。

因此,在 JS 调用 process.stdout.write() 和对 WriteConsoleW() 的内部调用( Node 实际输出到终端)。

这可以通过在 fd 1 上打开原始文件系统流从用户代码解决。

var rawStdout = new fs.SyncWriteStream(1, { autoClose: false });

将 ANSI 转义序列写入 rawStdout 将正确地发送到终端。

rawStdout.write('\x1b]9;3;"abc"\x1b\x5c');

(当然,这不会赋予 Windows 控制台任何神奇的新功能;它只会逐字打印序列,看起来像垃圾。您实际上必须使用某种支持 ANSI 转义码的终端仿真器。)


为了更好地实现我的特定目标,我最终编写了一个模块——console-title —通过在 unix 上编写 ANSI 转义序列并调用 appropriate native API 来更改控制台的标题在 Windows 下。这允许我在 Windows 的默认控制台窗口和模拟器(如 ConEmu)中更改标题。

关于windows - ANSI 转义序列不会打印到 Windows 上的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27575929/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com