Можно ли нажать на текст для ввода подсказки? - PullRequest
1 голос
/ 27 июня 2019

Я использую модуль подсказок, версия узла 12.4.0
Мне интересно, можно ли вставить строку в «поле ввода» prompt.get ()

Следующий скрипт отображает (двойное) «приглашение»:
Через 5 секунд вставляется текст «Это тест»
Когда дается команда ввода, строка не распознается как ввод.
Также невозможно отредактировать строку перед нажатием Enter.
(введите что-либо до 5 секунд и нажмите ввод, и на дисплее появится надпись)

Конечная цель: заставить команды отправлять подсказки из внешнего источника, но дать конечному пользователю возможность изменять команды перед вводом.

Я попробовал process.stdout.write, process.stdin.write
Я также пытался заменить process.std * .write на prompt.std * .write
Ответ может быть конкретным для ОС, но я пробовал этот код как под Win10 x64, так и под Linux

const prompt = require("prompt");

function myFunc() {
  process.stdin.write("This is a test");
}
setTimeout(myFunc, 5000);

prompt.get({
  properties: {
    test: {
      description: "prompt"
    }
  }
}, (err, result)=> {
  console.log("input: "+ result.test);
});

фактический результат:
~ / Nodejs / temp $ node index.js
prompt: prompt: Это тест
вход:
~ / Nodejs / температуры $

желаемый результат:
~ / Nodejs / temp $ node index.js
prompt: prompt: Это тест
вход: это тест
~ / Nodejs / температуры $

1 Ответ

0 голосов
/ 04 июля 2019

После изучения того, как работает модуль подсказок, я сам «решил» это.

Подсказка использует readline за кулисами, а readline имеет функцию .write, которая делает то, что мне нужно, отправляет редактируемый текст наprompt.

сама подсказка не расширяет эту функцию, и, поскольку она не поддерживается в течение 3 лет, я переключился на readline.

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'prompt> '
});

rl.prompt();

rl.on('line', (line) => {
  console.log(line);
  rl.prompt();
}).on('close', () => {
  console.log('Have a great day!');
  process.exit(0);
});


// simulate external input, and write to prompt>
function myFunc() {
  rl.write("This is a test");
}
setTimeout(myFunc, 5000); 
...