Node.js中的固定位置命令提示符

Why*_*rrh 13 javascript terminal command-line-interface node.js

有没有办法将命令提示符(只是一个question提示或类似的东西)固定到终端的底部,并使用Node.js记录它上面的输出.

一个非常糟糕的例子:

Your favourite food is sushi.
Your favourite food is chicken.
Your favourite food is okra.
--> What is your favourite food?
Run Code Online (Sandbox Code Playgroud)

基本上,我希望用户始终能够键入,并在输入上方回显输入.

interface.question("What is your favourite food?", function(answer) {
    // output the answer above where this prompt was
    // and somehow keep this same prompt where is is
});
Run Code Online (Sandbox Code Playgroud)

我希望使用它的特定应用程序是一个简单的IRC客户端,我有一个供用户输入的位置,并且输出所有输出(用户键入的内容,以及其他人也输入的内容)用户正在打字.下图中的线是虚构的.

----------------------------------------------------------------------
|                                                                    |
|                                                                    |
|                                                                    |
|                                                                    |
|                                                                    |
|                                                                    |
|                                                                    |
| Stuff                                                              |
| Stuff                                                              |
| Stuff                                                              |
----------------------------------------------------------------------
| --> The user can type here                                         |
----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

A-3*_*312 11

解决方案节点> 9.5.0

兼容:Linux/Windows;)

功能:

  • Readline始终可用;
  • 命令历史;
  • 自动完成;
  • 输入和输出之间没有分开;
  • 密码模式隐藏输入(尝试"pwd"命令),这里效果更好 ;
  • 您可以像浏览器一样评估命令或javascript功能.

例如

请参阅https://asciinema.org/a/10583,是控制台记录.

myReadline.js:
process.stdout.write("\x1Bc")
console.log(Array(process.stdout.rows + 1).join('\n'));

const myRL = require("serverline")

myRL.init()
myRL.getRL().question("What is your favourite food? ", function(answer) {
  console.log(`Your favourite food is ${answer}.`)
});

function main() {
  let i = 0
  setInterval(function() {
    const num = () => Math.floor(Math.random() * 255) + 1
    i++
    console.log(i + " " + num() + "." + num() + "." + num() + " user connected.")
  }, 700)
}
main()
Run Code Online (Sandbox Code Playgroud) main.js:
process.stdout.write("\x1Bc")
console.log(Array(process.stdout.rows + 1).join('\n'));

const myRL = require("serverline")

myRL.init()
myRL.getRL().question("What is your favourite food? ", function(answer) {
  console.log(`Your favourite food is ${answer}.`)
});

function main() {
  let i = 0
  setInterval(function() {
    const num = () => Math.floor(Math.random() * 255) + 1
    i++
    console.log(i + " " + num() + "." + num() + "." + num() + " user connected.")
  }, 700)
}
main()
Run Code Online (Sandbox Code Playgroud)

Eval javascript命令(如浏览器控制台):

process.stdout.write("\x1Bc")
console.log(Array(process.stdout.rows + 1).join('\n'));

const myRL = require("serverline")

myRL.init()
myRL.getRL().question("What is your favourite food? ", function(answer) {
  console.log(`Your favourite food is ${answer}.`)
});

function main() {
  let i = 0
  setInterval(function() {
    const num = () => Math.floor(Math.random() * 255) + 1
    i++
    console.log(i + " " + num() + "." + num() + "." + num() + " user connected.")
  }, 700)
}
main()
Run Code Online (Sandbox Code Playgroud)

linux pict

旧版 :

https://stackoverflow.com/revisions/24519813/3


zem*_*rco -1

只需使用readline核心模块:

var readline = require('readline');

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

rl.question("What do you think of node.js? ", function(answer) {
  console.log("Thank you for your valuable feedback:", answer);
  rl.close();
});
Run Code Online (Sandbox Code Playgroud)

这将解决您的问题:

var readline = require('readline');

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

var fav_foods = [];

var ask_question = function() {
  rl.question("What is your favourite food? ", function(answer) {
    fav_foods.push(answer)
    fav_foods.forEach(function (element) {
       console.log("Your favourite food is " + element)
    })
    ask_question()
  });
}

ask_question()
Run Code Online (Sandbox Code Playgroud)