स्टड से कीस्ट्रोक्स पढ़ने का तरीका


118

क्या चल रहे नोडज स्क्रिप्ट में आने वाले कीस्ट्रोक के लिए सुनना संभव है? अगर मैं process.openStdin()इसके 'data'आयोजन का उपयोग करता हूं और सुनता हूं तो अगली नई तिथि तक इनपुट बफर हो जाता है, जैसे:

// stdin_test.js
var stdin = process.openStdin();
stdin.on('data', function(chunk) { console.log("Got chunk: " + chunk); });

यह चल रहा है, मुझे मिलता है:

$ node stdin_test.js
                <-- type '1'
                <-- type '2'
                <-- hit enter
Got chunk: 12

मुझे क्या देखना है:

$ node stdin_test.js
                <-- type '1' (without hitting enter yet)
 Got chunk: 1

मैं रूबी में , उदाहरण के लिए, एक नोडज के बराबर देख रहा हूंgetc

क्या यह संभव है?


(इस टिप्पणी को जोड़ना ताकि यह प्रश्न ढूंढना आसान हो जाए; मुझे इसके लिए सही शब्द खोजने में कुछ दिन लगे): यह है कि कैसे इनपुट (नया लाइन) चरित्र इनपुट में भेजे जाने से पहले चरित्र द्वारा स्टड चरित्र को पढ़ना है।
चक्कर

जवाबों:


62

आप इसे इस तरह से प्राप्त कर सकते हैं, यदि आप कच्चे मोड पर जाते हैं:

var stdin = process.openStdin(); 
require('tty').setRawMode(true);    

stdin.on('keypress', function (chunk, key) {
  process.stdout.write('Get Chunk: ' + chunk + '\n');
  if (key && key.ctrl && key.name == 'c') process.exit();
});

6
चिंता मत करो, मुझे अपना आत्म पता चला,process.stdin.resume(); process.stdin.on('data', function (chunk) { process.stdout.write('data: ' + chunk); });
जेम्सएम-साइटगेन

3
के setRawModeनीचे होने के लिए आगे बढ़ें openStdin(), क्योंकि आप केवल मोड सेट कर सकते हैं यदि stdinप्रारंभिक है।
टॉवर

4
ऐसा प्रतीत होता है कि स्टडिन अब एक कीपर ईवेंट का उत्सर्जन नहीं करता है, बल्कि एक डेटा ईवेंट को अंतर मापदंडों के साथ उत्सर्जित करता है।
स्केगसे

2
अरे openStdin()एक पदावनत और पुराना API है? (मैंने 2011 के बाद नोड तरीका सीखा ...)
स्टीवन लू

3
उह, हाँ। वास्तव stdin.on('keypress',function(chunk,key))में हाल के संस्करणों में हटा दिया गया है। और मुझे पूरा यकीन openStdin()है कि या तो हटा दिया गया है या हटा दिया गया है। अब, आप process.stdin
स्टड का

132

इस क्षमता के छीन लिए जाने के बाद से tty, इस जवाब को खोजने के लिए , यहाँ स्टड से एक कच्चे चरित्र की धारा कैसे प्राप्त करें:

var stdin = process.stdin;

// without this, we would only get streams once enter is pressed
stdin.setRawMode( true );

// resume stdin in the parent process (node app won't quit all by itself
// unless an error or process.exit() happens)
stdin.resume();

// i don't want binary, do you?
stdin.setEncoding( 'utf8' );

// on any data into stdin
stdin.on( 'data', function( key ){
  // ctrl-c ( end of text )
  if ( key === '\u0003' ) {
    process.exit();
  }
  // write the key to stdout all normal like
  process.stdout.write( key );
});

बहुत सरल - मूल रूप से सिर्फ प्रक्रिया की तरह । स्टडी के दस्तावेज लेकिन setRawMode( true )एक कच्ची धारा प्राप्त करने के लिए उपयोग करना, जो कि प्रलेखन में पहचानना कठिन है।


2
धन्यवाद .. यह सही दूर लागू करने के लिए सरल और आसान था .. :) वास्तव में मैं क्या चाहता था।
कुशाल लिखी

2
Node.js 0.8+ के साथ काम नहीं करता है। आपको 'कीपर' आयात करना चाहिए। पीटर लियोन का जवाब देखें।
G-Wiz

2
इस किया 0.8 के साथ काम करते हैं, लेकिन मज़ा यह कैसे इस तरह के एक कभी बदलते एपीआई।
दान हेबर्डन

इसे प्राप्त करने के लिए कुंजी == '\ u0003' (त्रिकोणीय समान चिह्न के बजाय दोगुना) का उपयोग करना चाहिए
WHITECOLOR

1
क्या यह लिखने का एक तरीका है, नीचे, बाएँ, दाएँ कुंजियाँ?
टॉम आर

46

नोड में = = v6.1.0:

const readline = require('readline');

readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);

process.stdin.on('keypress', (str, key) => {
  console.log(str)
  console.log(key)
})

Https://github.com/nodejs/node/issues/6626 देखें


3
7 पर यह कोशिश कर रहा हूं और मुझे मिल गया है process.stdin.setRawMode is not a function। बाद में थोड़ा गहरा गोता लगाने की कोशिश करेंगे।
मैट मोलनार

3
@MattMolnar फ़ंक्शन केवल तभी मौजूद है जब वह एक TTY है, इसलिए उस पहले की जांच करें
curiousdannii

@MattMolnar के लिए आपको अपने ऐप को बाहरी टर्मिनल के रूप में चलाने की आवश्यकता है, देखें stackoverflow.com/questions/17309749/…
मक्सिम शमीहुलौ

29

इस संस्करण का उपयोग करता है कुंजी दबाने मॉड्यूल और समर्थन Node.js संस्करण 0.10, 0.8 और 0.6 में अच्छी तरह से iojs 2.3 के रूप में के रूप में। दौड़ना सुनिश्चित करें npm install --save keypress

var keypress = require('keypress')
  , tty = require('tty');

// make `process.stdin` begin emitting "keypress" events
keypress(process.stdin);

// listen for the "keypress" event
process.stdin.on('keypress', function (ch, key) {
  console.log('got "keypress"', key);
  if (key && key.ctrl && key.name == 'c') {
    process.stdin.pause();
  }
});

if (typeof process.stdin.setRawMode == 'function') {
  process.stdin.setRawMode(true);
} else {
  tty.setRawMode(true);
}
process.stdin.resume();

यह नोड v0.10.25 पर काम नहीं करता है, बल्कि यह कहता है process.stdin.setRawMode()कि त्रुटियों का उपयोग करें और कोई विधि निर्धारित नहीं करता है ।Mode, बहुत कष्टप्रद
Plentybinary

@Plentybinary मुझे संदेह है कि आप वास्तव में नोड v0.10.25 नहीं चला रहे हैं। मैंने इसे v0.10.25 के खिलाफ परीक्षण किया और यह ठीक से काम करता है। और process.stdin.setRawModeमौजूद है, एक फ़ंक्शन है, और ठीक से काम करता है। मैंने iojs-2.3.1 पर भी परीक्षण किया और यह अभी भी वहीं काम करता है।
पीटर ल्योन

FWIW, यह कम से कम v0.10.40 तक काम करना जारी रखता है
जॉन रिक्स

8

नोडज के साथ 0.6.4 परीक्षण ( संस्करण 0.8.14 में परीक्षण विफल रहा ):

rint = require('readline').createInterface( process.stdin, {} ); 
rint.input.on('keypress',function( char, key) {
    //console.log(key);
    if( key == undefined ) {
        process.stdout.write('{'+char+'}')
    } else {
        if( key.name == 'escape' ) {
            process.exit();
        }
        process.stdout.write('['+key.name+']');
    }

}); 
require('tty').setRawMode(true);
setTimeout(process.exit, 10000);

यदि आप इसे चलाते हैं और:

  <--type '1'
{1}
  <--type 'a'
{1}[a]

महत्वपूर्ण कोड # 1:

require('tty').setRawMode( true );

महत्वपूर्ण कोड # 2:

.createInterface( process.stdin, {} );

2
if(Boolean(process.stdout.isTTY)){
  process.stdin.on("readable",function(){
    var chunk = process.stdin.read();
    if(chunk != null)
      doSomethingWithInput(chunk);
  });
  process.stdin.setRawMode(true);
} else {
  console.log("You are not using a tty device...);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.