IO.js Readline

2018-11-28 22:35 更新

穩(wěn)定度: 2 - 穩(wěn)定

通過require('readline')來使用這個(gè)模塊。Readline允許逐行讀取一個(gè)流(如process.stdin)。

注意,一旦你執(zhí)行了這個(gè)模塊,你的io.js程序在你關(guān)閉此接口之前,將不會(huì)退出。以下是如何讓你的程序優(yōu)雅的退出的例子:

var readline = require('readline');

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

rl.question("What do you think of io.js? ", function(answer) {
  // TODO: Log the answer in a database
  console.log("Thank you for your valuable feedback:", answer);

  rl.close();
});

readline.createInterface(options)

創(chuàng)建一個(gè)readline接口實(shí)例。接受一個(gè)options對(duì)象,接受以下值:

  • input - 需要監(jiān)聽的可讀流(必選)。

  • output - 將逐行讀取的數(shù)據(jù)寫入的流(可選)。

  • completer - 用于Tab自動(dòng)補(bǔ)全的可選函數(shù)。參閱下文的使用例子。

  • terminal - 如果inputoutput流需要被像一個(gè)TTY一樣對(duì)待,并且被經(jīng)由ANSI/VT100轉(zhuǎn)義代碼寫入,就傳遞true。默認(rèn)為在實(shí)例化時(shí),檢查出的ouput流的isTTY值。

  • historySize - 保留的歷史記錄行的最大數(shù)量。默認(rèn)為30。

completer函數(shù)被給予了一個(gè)用戶輸入的當(dāng)前行,并且支持返回一個(gè)含有兩個(gè)元素的數(shù)組:

  1. 一個(gè)匹配當(dāng)前輸入補(bǔ)全的數(shù)組。

  2. 一個(gè)被用于匹配的子字符串。

最終形式如:[[substr1, substr2, ...], originalsubstring]。

例子:

function completer(line) {
  var completions = '.help .error .exit .quit .q'.split(' ')
  var hits = completions.filter(function(c) { return c.indexOf(line) == 0 })
  // show all completions if none found
  return [hits.length ? hits : completions, line]
}

completer同樣也可以以同步的方式運(yùn)行,如果它接受兩個(gè)參數(shù):

function completer(linePartial, callback) {
  callback(null, [['123'], linePartial]);
}

createInterface通常與process.stdinprocess.stdout搭配,用來接受用戶輸入:

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

一旦你有了一個(gè)readline接口,你通常要監(jiān)聽一個(gè)line事件。

如果這個(gè)實(shí)例中,terminaltrue。那么output流將會(huì)得到最好的兼容性,如果它定義了output.columns屬性,并且在outputcolumns變化時(shí)(當(dāng)它是一個(gè)TTY時(shí),process.stdout會(huì)自動(dòng)這么做),觸發(fā)了一個(gè)resize事件。

Class: Interface

一個(gè)代表了有inputoutput流的readline接口。

rl.setPrompt(prompt)

設(shè)置提示符,例如當(dāng)你在命令行運(yùn)行iojs命令時(shí),你看到了>,這就是io.js的提示符。

rl.prompt([preserveCursor])

為用戶的輸入準(zhǔn)備好readline,在新的一行放置當(dāng)前的setPrompt選項(xiàng),給予用戶一個(gè)新的用于輸入的地方。設(shè)置preserveCursortrue,來防止光標(biāo)位置被重置為0。

仍會(huì)重置被createInterface使用的input流,如果它被暫停。

如果當(dāng)調(diào)用createInterface時(shí)output被設(shè)置為nullundefined,提示符將不會(huì)被寫入。

rl.question(query, callback)

帶著query來預(yù)先放置提示符,并且在用戶應(yīng)答時(shí)執(zhí)行回調(diào)函數(shù)。給用戶展示query,然后在用戶輸入了應(yīng)答后調(diào)用callback。

仍會(huì)重置被createInterface使用的input流,如果它被暫停。

如果當(dāng)調(diào)用createInterface時(shí)output被設(shè)置為nullundefined,什么都不會(huì)被展示。

例子:

interface.question('What is your favorite food?', function(answer) {
  console.log('Oh, so your favorite food is ' + answer);
});

rl.pause()

暫停readlineinput流,允許它在晚些需要時(shí)恢復(fù)。

注意,帶著事件的流不會(huì)立刻被暫停。在調(diào)用了pause后,許多事件可能被觸發(fā),包括line事件。

rl.resume()

恢復(fù)readlineinput流。

rl.close()

關(guān)閉實(shí)例接口,放棄對(duì)inputoutput流的控制。close事件也會(huì)被觸發(fā)。

rl.write(data[, key])

output流寫入數(shù)據(jù),除非當(dāng)調(diào)用createInterface時(shí)output被設(shè)置為nullundefined。key是一個(gè)代表了鍵序列的對(duì)象;在當(dāng)終端為TTY時(shí)可用。

如果input流被暫停,它也會(huì)被恢復(fù)。

例子:

rl.write('Delete me!');
// Simulate ctrl+u to delete the line written previously
rl.write(null, {ctrl: true, name: 'u'});

Events

Event: 'line'

  • function (line) {}

當(dāng)input流收到一個(gè)\n時(shí)觸發(fā),通常在用戶敲下回車時(shí)觸發(fā)。這是一個(gè)監(jiān)聽用戶輸入的好鉤子。

例子:

rl.on('line', function (cmd) {
  console.log('You just typed: '+cmd);
});

Event: 'pause'

  • function () {}

當(dāng)input流被暫停時(shí)觸發(fā)。

也會(huì)在input沒有被暫停并且收到一個(gè)SIGCONT事件時(shí)觸發(fā)(參閱SIGTSTP事件和SIGCONT事件)。

例子:

rl.on('pause', function() {
  console.log('Readline paused.');
});

Event: 'resume'

  • function () {}

當(dāng)input流被恢復(fù)時(shí)觸發(fā)。

例子:

rl.on('resume', function() {
  console.log('Readline resumed.');
});

Event: 'close'

  • function () {}

當(dāng)close()被調(diào)用時(shí)觸發(fā)。

也會(huì)在input流收到它的end事件時(shí)觸發(fā)。當(dāng)這個(gè)事件觸發(fā)時(shí),接口實(shí)例需要考慮“被結(jié)束”。例如,當(dāng)input流接收到^D(也被認(rèn)作EOT)。

這個(gè)事件也會(huì)在如果當(dāng)前沒有SIGINT事件監(jiān)聽器,且input流接收到^C(也被認(rèn)作SIGINT)時(shí)觸發(fā)。

Event: 'SIGINT'

  • function () {}

當(dāng)input流接收到^C(也被認(rèn)作SIGINT)時(shí)觸發(fā)。如果當(dāng)前沒有SIGINT事件的監(jiān)聽器,pause事件將會(huì)被觸發(fā)。

例子:

rl.on('SIGINT', function() {
  rl.question('Are you sure you want to exit?', function(answer) {
    if (answer.match(/^y(es)?$/i)) rl.pause();
  });
});

Event: 'SIGTSTP'

  • function () {}

在Windows平臺(tái)下不能使用。

當(dāng)input流接收到一個(gè)^Z(也被認(rèn)作SIGTSTP)時(shí)觸發(fā)。如果當(dāng)前沒有SIGTSTP事件的監(jiān)聽器,這個(gè)程序?qū)?huì)被送至后臺(tái)運(yùn)行。

當(dāng)程序使用fg恢復(fù),pauseSIGCONT事件都會(huì)被觸發(fā)。你可以選擇其中的一個(gè)來恢復(fù)流。

如果流在程序被送至后臺(tái)前就被暫停,pauseSIGCONT事件將不會(huì)觸發(fā)。

例子:

rl.on('SIGTSTP', function() {
  // This will override SIGTSTP and prevent the program from going to the
  // background.
  console.log('Caught SIGTSTP.');
});

Event: 'SIGCONT'

  • function () {}

在Windows平臺(tái)下不能使用。

當(dāng)input流被^Z(也被認(rèn)作SIGTSTP)送至后臺(tái)時(shí)觸發(fā),然后使用fg(1)繼續(xù)執(zhí)行。這個(gè)事件僅在程序被送至后臺(tái)前流沒有被暫停時(shí)觸發(fā)。

例子:

rl.on('SIGCONT', function() {
  // `prompt` will automatically resume the stream
  rl.prompt();
});

Example: Tiny CLI

下面是一個(gè)使用以上方法來創(chuàng)建一個(gè)迷你的控制臺(tái)接口的例子:

var readline = require('readline'),
    rl = readline.createInterface(process.stdin, process.stdout);

rl.setPrompt('OHAI> ');
rl.prompt();

rl.on('line', function(line) {
  switch(line.trim()) {
    case 'hello':
      console.log('world!');
      break;
    default:
      console.log('Say what? I might have heard `' + line.trim() + '`');
      break;
  }
  rl.prompt();
}).on('close', function() {
  console.log('Have a great day!');
  process.exit(0);
});

readline.cursorTo(stream, x, y)

在給定的TTY流中,將光標(biāo)移動(dòng)到指定位置。

readline.moveCursor(stream, dx, dy)

在給定的TTY流中,相對(duì)于當(dāng)前位置,將光標(biāo)移動(dòng)到指定位置。

readline.clearLine(stream, dir)

用指定的方式,在給定的TTY流中,清除當(dāng)前的行。dir可以是以下值之一:

  • -1 - 從光標(biāo)的左邊
  • 1 - 從光標(biāo)的右邊
  • 0 - 整行

    readline.clearScreenDown(stream)

從當(dāng)前的光標(biāo)位置,清除屏幕。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)