2016-05-18 5 views
2

У меня есть сценарий Node.js, который выглядит следующим образом:Обнаружение нажатия клавиш и замена строк в консоли

var chalk = require("chalk"); 
var https = require("https"); 
var express = require("express"); 
var fs = require("fs") 
var app = express(); 
const readline = require("readline"); 
var keypress = require("keypress"); 
var process = require("process"); 
var emitter = require("emitter"); 

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

console.log('  _______'); 
console.log(' / o \\ .------------------------.'); 
console.log('  |   > | Welcome to chikin! |'); 
console.log('  \\_______/ | A npm package manager |'); 
console.log("  | |  '------------------------'"); 
console.log('  ^ ^'); 
console.log('_____________________________________________\n'); 
console.log(chalk.bold.green('What would you like to do?') + ' Type ' + chalk.bold.blue('a') + ',' + chalk.bold.blue('b') + ', or ' + chalk.bold.blue('c')); 
console.log('_________________________________________'); 
console.log('a. ' + chalk.bold.blue('Install Packages')); 
console.log('b. ' + chalk.bold.blue('Update Packages')); 
console.log('c. ' + chalk.bold.blue('Uninstall Packages\n')); 

var du = ''; 
var valid = false; 

rl.question('?> ', function(answer) { 
    var areValid = ['a', 'b', 'c', 'A', 'B', 'C', 'a.', 'b.', 'c.', 'A.', 'B.', 'C.']; 
    if (answer in areValid) { 
     valid = true; 
    } 
}) 

Этот скрипт пытается определить, хочет ли использование А. Установка пакетов, B. Обновить пакеты или C. Удалить пакеты. Использование метода rl.question() не работает, так как при его запуске курсор просто мерцает и не позволяет мне вводить что-либо. Поэтому вместо того, чтобы использовать подсказку, я думал, что смогу обнаружить ее с помощью нажатия клавиш. Хотя я понятия не имею, как это сделать. Я также думал, что он может заменить последнюю строку консоли на последний действительный ответ. Будет ли какой-нибудь способ сделать это?

+2

Вы имеете в виду первую строчку? – heemayl

+0

@heemayl Да, первая строка печатает. –

+0

'subprocess.check_output (['bash', '/path/to/script.sh']). Decode ('utf-8'). Split ('\ n') [0]'? – heemayl

ответ

1

При использовании readline вы должны сохранить состояние пользовательского ввода всегда заперта (paused)

Я надеюсь, что это помогает, удачи:

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

const LINE = ''; 
const LINE2 = '\n'; 

const PROMPT = '?> '; 

rl.setPrompt(PROMPT); 

// prevent user input by default: lock the state 
rl.pause(); 

var steps = { 

    a: function() 
    { 
     console.log('You selected "Install Packages"', LINE); 

     var trials = 0; 
     ask('Enter package name(s) (separated with ,) you want to install:', function(answer) 
     { 
      var packages = answer.toLowerCase().split(/[^a-z_\-]/).filter(function(pkg) { 
       return pkg.length; 
      }); 

      if (!packages.length) 
      { 
       if (++trials > 2) 
       { 
        console.log('Are you kidding me?'); 
        process.exit(); 
       } 

       return false; // ask again 
      } 

      confirm('Packages below will be installed, are you confirm? (y/Y or not)' 
       + LINE2 + ' --> ' + packages.join(', '), function(answer) 
       { 
        console.log(LINE2); 

        if (!answer) 
        { 
         steps.a(); // start this step again 
         return; 
        } 

        console.log('You confirmed but', LINE); 
        steps.c(1); 
       }); 
     }); 
    }, 

    b: function() 
    { 
     console.log('You selected "Update Packages"', LINE); 
     console.log('Now, please enter the package name you want to update: '); 

     input('acme-package', function(pkg) { 

      if ('acme-package' !== pkg) 
      { 
       console.log('Really!?', LINE); 
       process.exit(); 
      } 
      // else 
       steps.c(1); 
     }); 
    }, 

    c: function(internal) 
    { 
     if (!internal) { 
      console.log('You selected "Uninstall Packages"', LINE); 
     } 

     console.log("Sorry, I don't know what to do now.", LINE, 'Program will exit.'); 
     process.exit(); 
    } 
}; 

/** 
* Test 
*/ 
console.log('What would you like to do?', LINE2); 

console.log('a. Install Packages', LINE); 
console.log('b. Update Packages', LINE); 
console.log('c. Uninstall Packages', LINE2); 

ask('What would you like to do?', function(answer) { 

    answer = answer.toLowerCase(); 

    if (!steps[answer]) { 
     return false; 
    } 

    steps[answer](); 
    // first step: after this point you can handle other events in your 'steps' 
}); 


/** 
* Functions 
*/ 
function confirm(message, callback) 
{ 
    console.log(message, LINE); 
    // print confirmation message 

    rl.pause(); 
    // lock: ensure 

    rl.question(PROMPT, function(answer) 
    // unlock 
    { 
     rl.pause(); 
     // lock again 

     answer = answer.trim().toLowerCase(); 

     if (!answer.length) { 
      confirm(message, callback); // again 
     } 
     else { 
      callback(/^y(e(s|p|ah?))?$/.test(answer)); // y|yes|yep|yea|yeah 
     } 
    }); 
} 

function ask(question, placeholder, callback) 
{ 
    if (typeof placeholder === 'function') 
    { 
     callback = placeholder; 
     placeholder = null; 
    } 

    console.log(question, LINE); 
    // print question message 

    rl.pause(); 
    // lock 

    rl.question(PROMPT, function(answer) 
    // unlock 
    { 
     rl.pause(); 
     // lock again 

     var response = callback(answer.trim()); 
     if (response) { 
      ask(typeof response === 'string' ? response : question, placeholder, callback); 
      // again 
     } 
    }); 

    if (placeholder) { 
     rl.write(placeholder); 
    } 
} 

function input(placeholder, callback) 
{ 
    if (typeof placeholder === 'function') 
    { 
     callback = placeholder; 
     placeholder = null; 
    } 

    rl.pause(); 
    // lock 

    rl.question(LINE + PROMPT, function(answer) 
    // unlock 
    { 
     rl.pause(); 
     // lock again 

     var answer = answer.trim(); 

     if (!answer || callback(answer) === false) { 
      input(callback); 
     } 
    }); 

    if (placeholder) { 
     rl.write(placeholder); 
    } 
} 

process.on('exit', function() 
{ 
    rl.pause(); 
    // always lock before 'console.log' 

    console.log(LINE, 'bye!'); 
}); 

бонус:

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

var pr = '+'; 

setInterval(function() { 

    rl.setPrompt(pr += '+'); 

    rl.prompt(); 
    rl.pause(); 

    if (pr.length > 20) { 
     process.exit(); 
    } 

}, 100); 
1

Как насчет стороннего модуля для его обработки? Как this или that

Смежные вопросы