স্টিডেন থেকে কীস্ট্রোকগুলি কীভাবে পড়তে হবে তা নোডেজ


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

আমি খুঁজছি সমতুল্য করার, যেমন nodejs, 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
Dont Worry, আমি আমার স্ব, খুঁজে পাওয়া যায় নিprocess.stdin.resume(); process.stdin.on('data', function (chunk) { process.stdout.write('data: ' + chunk); });
JamesM-SiteGen

3
setRawModeনীচের দিকে যেতে সরান openStdin(), কারণ আপনি কেবলমাত্র stdinআরম্ভ করা থাকলে মোডটি সেট করতে পারেন ।
টাওয়ার

4
এটি প্রদর্শিত হয় যে স্টিডিন আর কোনও কী-চাপড়ান ইভেন্টটি প্রকাশ করে না, পরিবর্তে পার্থক্যগুলির সাথে পরামিতিগুলির সাথে একটি ডেটা ইভেন্ট নির্গত করে।
স্কেগসে

2
আরে কি openStdin()অবহেলিত এবং পুরানো এপিআই? (আমি ২০১১ সালের পরে নোডের উপায় শিখেছি ...)
স্টিভেন লু

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
নোড.জেএস 0.8+ এর সাথে কাজ করে না। আপনাকে অবশ্যই 'কীপ্রেস' আমদানি করতে হবে। পিটার লাইন্সের উত্তর দেখুন।
জি-উইজ

2
এই করেনি 0.8 সঙ্গে কাজ, কিন্তু মজা কিভাবে এটি যেমন একটি সদা পরিবর্তন API আছে।
ড্যান হবারডেন

এটি ব্যবহার করতে কী == '\ 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 আপনি বহিরাগত টার্মিনাল হিসাবে আপনার অ্যাপ্লিকেশন চালানোর জন্য প্রয়োজন দেখতে stackoverflow.com/questions/17309749/...
মাক্সিম Shamihulau

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()পরিবর্তে ব্যবহারের কথা বলায় তবে ত্রুটিগুলি বলে এবং কোনও পদ্ধতি সেট করে না র‍ওমোড, খুব বিরক্তিকর
প্ল্যান্টিবাইনারি

@ প্রচুর পরিমাণে আমার সন্দেহ হয় আপনি আসলে নোড v0.10.25 চালাচ্ছেন না। আমি v0.10.25 এর বিপরীতে এটি পরীক্ষা করেছি এবং এটি সঠিকভাবে কাজ করে। এবং process.stdin.setRawModeবিদ্যমান, একটি ফাংশন, এবং সঠিকভাবে কাজ করে। আমি আইওএস -২.৩.১ এও পরীক্ষা করেছি এবং এটি এখনও সেখানে কাজ করে।
পিটার লিয়নস

FWIW, এটি কমপক্ষে v0.10.40 অবধি সুন্দরভাবে কাজ করে চলেছে
জন রিক্স

8

নোডেজ ০..6.৪ পরীক্ষিত (পরীক্ষায় 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...);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.