【问题标题】:STDOUT gets in front of STDIN while prompting?提示时 STDOUT 在 STDIN 前面?
【发布时间】:2012-12-04 18:36:07
【问题描述】:

我有一个 setInterval 每秒记录一次时间。 我想使用 STDIN 在我的脚本中执行命令,但 STDOUT 在我键入时移动光标并将其自身置于提示符中。

我对提示没有太多经验,只是开始深入研究。

脚本:

setInterval(function(){
    console.log(new Date().toUTCString());
},1000)

var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question("Hi there, how are you?", function(answer) {

});

输出:

Hi there, how are you?Mon, 17 Dec 2012 16:20:34 GMT
fine
Mon, 17 Dec 2012 16:20:35 GMT
Mon, 17 Dec 2012 16:20:36 GMT
Mon, 17 Dec 2012 16:20:37 GMT
Mon, 17 Dec 2012 16:20:38 GMT

你会如何解决这样的问题?缓存所有的STDOUT,清屏,写完所有的STDOUT,每次console.log()记录时再次提示?

是的,我确实想创建某种基于聊天的系统/命令行界面,其中输出保持在输入之上。

谢谢!

【问题讨论】:

  • 为什么要同时登录到标准输出和打字?也许改为登录到文件?即使在视觉上分散了几行,您的输入也应该仍然有效。
  • 假设我想创建某种在终端中工作的聊天客户端,我不需要记录我的输入,但由于其他因素(例如其他用户)正在记录)

标签: node.js stdout stdin prompt


【解决方案1】:

基本上你要问的是如何制作一个复杂的终端应用程序。最流行的库称为ncurses,它有node bindings here。不幸的是,我没有使用它的个人经验。

您的另一个选择是按照您所说的去做,并使用您自己的内部缓冲区手动重新渲染终端。你可以使用Node的tty模块,docs here获取输出终端的大小,然后使用ANSI escape codes清空终端,将光标定位到你想要的位置,然后使用process.stdout.write打印你想要的。

您可以在我的另一个问题over here 中看到使用转义码的示例

【讨论】:

  • 感谢您的建议,所以我想这就是这样做的方法。您是否认为重新渲染终端也是其他复杂终端应用程序(例如通过 telnet 的 Eggdrop 派对线路)中使用的技术?
猜你喜欢
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多