process.stdout.write() не работает в программе Node.js readline CLI

Я использую модуль readline для создания интерфейса командной строки (CLI) для приложения в Node. js.

Проблема в том, что я не могу прокрутить вверх, чтобы просмотреть прошлые команды, как обычно в Терминале. Мой CLI — это просто фиксированное окно, и если я вывожу слишком много на экран, я теряю информацию вверху, и нет возможности прокрутить вверх, чтобы увидеть ее.

(Я запускаю свою программу на Mac OSX Mavericks)

Заранее спасибо.

Фрагмент кода:

var readline = require('readline');

var Cli = function () {
    this.txtI = process.stdin;
    this.txtO = process.stdout;

    process.stdout.write('CLI initialized.');

    this.rl = readline.createInterface({input: this.txtI, output: this.txtO });
    this.rl.setPrompt('>>>');
    this.rl.prompt();
    this.rl.on('line', function(line) {
        var input = line.toString().trim();
        if (input) {
            this.txtO.write('cmd: ' + input);
        }
        this.rl.prompt();
    }.bind(this)).on('close', function() {
        this.txtO.write('Have a great day!');
        process.exit(0);
    }.bind(this));
};

new Cli();

Сохраните этот файл как snippet.js и запустите

node snippet.js

в терминале.


person rustybeanstalk    schedule 20.11.2013    source источник
comment
Вы хотите показать прошлые команды как? Например, когда вы нажимаете клавишу со стрелкой ВВЕРХ? Если это так, это то, что вам нужно реализовать.   -  person WiredPrairie    schedule 20.11.2013
comment
Не могли бы вы опубликовать, как вы используете readline в своем скрипте узла?   -  person Jeff Sisson    schedule 20.11.2013
comment
Я добавил дистиллированную версию своего CLI. Кажется, я исправил проблему с прокруткой с помощью этого кода. У меня другая проблема. Я не могу писать в поток process.stdout. Любая помощь с этим?   -  person rustybeanstalk    schedule 21.11.2013
comment
Почему вы кешируете process.stdout с переменной this.txtO? Почему бы просто не использовать / ссылка process.stdout напрямую?   -  person Jeff Sisson    schedule 21.11.2013
comment
Я хотел бы использовать любые потоки, а не только process.stdin и process.stdout. Я мог передать любой поток в txtI и передать txtO в любой поток.   -  person rustybeanstalk    schedule 22.11.2013


Ответы (2)


Readline — отличный модуль. История уже есть. Так же есть возможность добавить доработку. Попробуйте фрагмент ниже.

var readline = require('readline');

function createCLI(opt) {

    var rl = readline.createInterface({
          input : opt.input,
         output : opt.output,
       terminal : opt.terminal || true,
      completer : opt.completer ||
        function asyncCompleter(linePartial, callback){
          var completion = linePartial.split(/[ ]+/);
          callback(null, [completion, linePartial]);
        }
    });

    rl.on('line', function(line) {
      if( !line.trim() ){  this.prompt();  }
      else { this.write(line); }
    }).on('close', function() {
      this.output.write('\n Have a great day!');
      process.exit(0);
    }).setPrompt(' > ');

    rl.output.write(' CLI initialized\n');
    return rl;
}

var cli = createCLI({
   input : process.stdin,
  output : process.stdout
});

cli.prompt();
person stringparser    schedule 04.11.2014

Вероятно, это работает, просто readline перезаписывает вашу строку. Попробуйте вывести несколько строк:

process.stdout.write("1\n2\n3\n4\n5");
person Vad    schedule 31.05.2015