通過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();
});
創(chuàng)建一個(gè)readline
接口實(shí)例。接受一個(gè)options
對(duì)象,接受以下值:
input - 需要監(jiān)聽的可讀流(必選)。
output - 將逐行讀取的數(shù)據(jù)寫入的流(可選)。
completer - 用于Tab自動(dòng)補(bǔ)全的可選函數(shù)。參閱下文的使用例子。
terminal - 如果input
和output
流需要被像一個(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ù)組:
一個(gè)匹配當(dāng)前輸入補(bǔ)全的數(shù)組。
一個(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.stdin
和process.stdout
搭配,用來接受用戶輸入:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
一旦你有了一個(gè)readline
接口,你通常要監(jiān)聽一個(gè)line
事件。
如果這個(gè)實(shí)例中,terminal
為true
。那么output
流將會(huì)得到最好的兼容性,如果它定義了output.columns
屬性,并且在output
的columns
變化時(shí)(當(dāng)它是一個(gè)TTY時(shí),process.stdout
會(huì)自動(dòng)這么做),觸發(fā)了一個(gè)resize
事件。
一個(gè)代表了有input
和output
流的readline
接口。
設(shè)置提示符,例如當(dāng)你在命令行運(yùn)行iojs
命令時(shí),你看到了>
,這就是io.js
的提示符。
為用戶的輸入準(zhǔn)備好readline
,在新的一行放置當(dāng)前的setPrompt
選項(xiàng),給予用戶一個(gè)新的用于輸入的地方。設(shè)置preserveCursor
為true
,來防止光標(biāo)位置被重置為0
。
仍會(huì)重置被createInterface
使用的input
流,如果它被暫停。
如果當(dāng)調(diào)用createInterface
時(shí)output
被設(shè)置為null
或undefined
,提示符將不會(huì)被寫入。
帶著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è)置為null
或undefined
,什么都不會(huì)被展示。
例子:
interface.question('What is your favorite food?', function(answer) {
console.log('Oh, so your favorite food is ' + answer);
});
暫停readline
的input
流,允許它在晚些需要時(shí)恢復(fù)。
注意,帶著事件的流不會(huì)立刻被暫停。在調(diào)用了pause
后,許多事件可能被觸發(fā),包括line
事件。
恢復(fù)readline
的input
流。
關(guān)閉實(shí)例接口,放棄對(duì)input
和output
流的控制。close
事件也會(huì)被觸發(fā)。
向output
流寫入數(shù)據(jù),除非當(dāng)調(diào)用createInterface
時(shí)output
被設(shè)置為null
或undefined
。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'});
當(dāng)input
流收到一個(gè)\n
時(shí)觸發(fā),通常在用戶敲下回車時(shí)觸發(fā)。這是一個(gè)監(jiān)聽用戶輸入的好鉤子。
例子:
rl.on('line', function (cmd) {
console.log('You just typed: '+cmd);
});
當(dāng)input
流被暫停時(shí)觸發(fā)。
也會(huì)在input
沒有被暫停并且收到一個(gè)SIGCONT
事件時(shí)觸發(fā)(參閱SIGTSTP
事件和SIGCONT
事件)。
例子:
rl.on('pause', function() {
console.log('Readline paused.');
});
當(dāng)input
流被恢復(fù)時(shí)觸發(fā)。
例子:
rl.on('resume', function() {
console.log('Readline resumed.');
});
當(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ā)。
當(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();
});
});
在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ù),pause
和SIGCONT
事件都會(huì)被觸發(fā)。你可以選擇其中的一個(gè)來恢復(fù)流。
如果流在程序被送至后臺(tái)前就被暫停,pause
和SIGCONT
事件將不會(huì)觸發(fā)。
例子:
rl.on('SIGTSTP', function() {
// This will override SIGTSTP and prevent the program from going to the
// background.
console.log('Caught SIGTSTP.');
});
在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();
});
下面是一個(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);
});
在給定的TTY流中,將光標(biāo)移動(dòng)到指定位置。
在給定的TTY流中,相對(duì)于當(dāng)前位置,將光標(biāo)移動(dòng)到指定位置。
用指定的方式,在給定的TTY流中,清除當(dāng)前的行。dir
可以是以下值之一:
從當(dāng)前的光標(biāo)位置,清除屏幕。
更多建議: