2017-01-04 2 views
0

Я пытаюсь сделать программу в nodejs, которая может ждать ввода пользователя во время печати других материалов на экране, не испортив все.Обработка ввода nodejs при выводе

Используя следующий код:

setInterval(function(){ 
     console.log("just displaying some stuff"); 
},1000); 
process.stdin.on("data", function(char) { 
    console.log(char); 
}); 

Я получаю следующий результат:

just displaying some stuff 
just displaying some stuff 
'this is' just displaying some stuff 
'in'just displaying some stuff 
'put'just displaying some stuff 

Результат я искал что-то вроде:

just displaying some stuff 
just displaying some stuff 
just displaying some stuff 
just displaying some stuff 
just displaying some stuff 
'this is input' 

Любые идеи? Я не мог найти ничего полезного.

+0

Вы сразу же отправляете входные данные с stdin на консоль. Что еще вы ожидали? – Flimzy

ответ

1

Вы можете сделать что-то подобное с ncurses или какой-либо другой текстовой библиотекой пользовательского интерфейса. В узле есть отличный модуль под названием blessed, который может помочь вам в таких вещах. См:

Он имеет некоторые хорошие демки с еще более сложными случаями применения:

В вашем случае вы можете сделать окно, которое занимает весь экран минус одну строку и напечатайте там текст, получая вход во второе окно ниже, которое может быть одной строкой выше или выше, если вам нужно.

Это будет сложнее, чем положить простой console.log(), но это, безусловно, возможно и не слушает людей, которые говорят вам, что это не так.

+0

То, что мне нужно, спасибо! – Globala

1

Как сказал rsp, блаженный - отличный инструмент для этого. Вот пример реализации для вас.

Я использовал блаженство, чтобы создать текстовое поле в нижней строке экрана. Остальная часть экрана - это «тело», где будет добавлен вывод кода. Таким образом, когда вы вводите ввод, ваша программа не будет путать его с выходом, как вы это пережили.

Чтобы попробовать это, запустите npm install blessed --save, а затем запустить этот код в узле:

const blessed = require('blessed'); 

var screen = blessed.screen(); 
var body = blessed.box({ 
    top: 0, 
    left: 0, 
    height: '100%-1', 
    width: '100%', 
    keys: true, 
    mouse: true, 
    alwaysScroll: true, 
    scrollable: true, 
    scrollbar: { 
    ch: ' ', 
    bg: 'red' 
    } 
}); 
var inputBar = blessed.textbox({ 
    bottom: 0, 
    left: 0, 
    height: 1, 
    width: '100%', 
    keys: true, 
    mouse: true, 
    inputOnFocus: true, 
    style: { 
    fg: 'white', 
    bg: 'blue' // Blue background so you see this is different from body 
    } 
}); 

// Add body to blessed screen 
screen.append(body); 
screen.append(inputBar); 

// Close the example on Escape, Q, or Ctrl+C 
screen.key(['escape', 'q', 'C-c'], (ch, key) => (process.exit(0))); 

// Handle submitting data 
inputBar.on('submit', (text) => { 
    log(text); 
    inputBar.clearValue(); 
}); 

// Add text to body (replacement for console.log) 
function log(text) { 
    body.pushLine(text); 
    screen.render(); 
} 


/* 
* Demonstration purposes 
*/ 

// Listen for enter key and focus input then 
screen.key('enter', (ch, key) => { 
    inputBar.focus(); 
}); 

// Log example output 
setInterval(() => { 
    log("just displaying some stuff"); 
}, 1000); 

Ключевые моменты здесь:

  • Ваш код должен показать вывод с помощью функции log. Подумайте об этом как о замене взамен console.log. Не используйте функции console.*, они испортят экран благословенного.
  • Вам необходимо «сфокусировать» элемент inputBar для его ввода. Однако вы можете сосредоточиться на ней, но моя демонстрация показывает, как слушать нажатие клавиши ввода или щелкнуть по синей полосе, чтобы сфокусировать ее.
  • Если вы пишете код, который манипулирует экраном, не забудьте запустить screen.render(), чтобы сделать ваши изменения.
Смежные вопросы