【问题标题】:Fixed position command prompt in Node.jsNode.js 中的固定位置命令提示符
【发布时间】:2012-09-22 05:43:12
【问题描述】:

有没有办法将命令提示符(只是 question 提示符或类似的提示符)固定在终端底部,并使用 Node.js 在其上方记录输出。

一个非常糟糕的例子:

Your favourite food is sushi.
Your favourite food is chicken.
Your favourite food is okra.
--> What is your favourite food?

所以本质上,我希望用户始终能够输入,并在提示上方回显输入。

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
});

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

----------------------------------------------------------------------
|                                                                    |
|                                                                    |
|                                                                    |
|                                                                    |
|                                                                    |
|                                                                    |
|                                                                    |
| Stuff                                                              |
| Stuff                                                              |
| Stuff                                                              |
----------------------------------------------------------------------
| --> The user can type here                                         |
----------------------------------------------------------------------

【问题讨论】:

  • 你找到解决办法了吗?
  • 显然不是。所提出的答案都没有解决这个问题。
  • @ThomasDickey 尝试或在评论中说出答案不好的原因。

标签: javascript node.js terminal command-line-interface


【解决方案1】:

Serverline module

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()

旧版本:

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

【讨论】:

    【解决方案2】:

    这是一个简单的解决方案(在 macos 上使用 node v6.4.0 测试):

    const readline = require('readline');
    const rl = readline.createInterface(process.stdin, process.stdout);
    
    // Logs a message keeping prompt on last line
    function log(message) {
      readline.cursorTo(process.stdout, 0);
      console.log(message);
      rl.prompt(true);
    }
    
    // Testing the solution
    
    rl.question('Enter something...:', userInput => {
      log('You typed ' + userInput);
      rl.close();
    });
    
    log('this should appear above the prompt');
    setTimeout(
      () => log('this should appear above the prompt'),
      1000
    );
    

    【讨论】:

    • 简单、直观且效果很好!谢谢。我从上面的答案中对其进行了一些更改,以便在输入输入时使问题事物递归循环。
    【解决方案3】:

    嗯,我正在使用inquirer 来解决这类问题。它已经解决了所有这些问题。它易于使用,并且您有不同类型的道具类型。

    这里是文档中的一个小例子:

    var inquirer = require('inquirer');
    inquirer.prompt([/* Pass your questions in here */]).then(function (answers) {
        // Use user feedback for... whatever!! 
    });
    

    【讨论】:

    • -1,Inquirer 并没有很好地解决这个问题。我在 Windows 上每 1 秒设置一个 console.log,在新的 stdout 上,旧的询问器提示保留在新的 stdout 行上,并且仅在您开始输入时重新出现。
    【解决方案4】:

    只需使用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();
    });
    

    这将解决您的问题:

    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()
    

    【讨论】:

    • 这将如何保持原样?
    • 什么意思?还可以查看在给定链接下可以找到的更复杂的示例(页面末尾)
    • 我运行了this 示例,这与我想要做的很接近。我想要的是提示始终位于终端底部,console.log()(或其他功能)位于提示上方。
    猜你喜欢
    • 2016-04-30
    • 2012-12-08
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多