# Readline Stability: 3 - Stable To use this module, do `require('readline')`. Readline allows reading of a stream (such as STDIN) on a line-by-line basis. Note that once you've invoked this module, your node program will not terminate until you've paused the interface. Here's how to allow your program to gracefully pause: var rl = require('readline'); var i = rl.createInterface(process.stdin, process.stdout, null); i.question("What do you think of node.js?", function(answer) { // TODO: Log the answer in a database console.log("Thank you for your valuable feedback."); i.pause(); }); ## rl.createInterface(input, output, completer) Takes two streams and creates a readline interface. The `completer` function is used for autocompletion. When given a substring, it returns `[[substr1, substr2, ...], originalsubstring]`. Also `completer` can be run in async mode if it accepts two arguments: function completer(linePartial, callback) { callback(null, [['123'], linePartial]); } `createInterface` is commonly used with `process.stdin` and `process.stdout` in order to accept user input: var readline = require('readline'), rl = readline.createInterface(process.stdin, process.stdout); ## Class: Interface The class that represents a readline interface with a stdin and stdout stream. ### rl.setPrompt(prompt, length) Sets the prompt, for example when you run `node` on the command line, you see `> `, which is node's prompt. ### rl.prompt() Readies readline for input from the user, putting the current `setPrompt` options on a new line, giving the user a new spot to write. This will also resume the `in` stream used with `createInterface` if it has been paused. ### rl.question(query, callback) Prepends the prompt with `query` and invokes `callback` with the user's response. Displays the query to the user, and then invokes `callback` with the user's response after it has been typed. This will also resume the `in` stream used with `createInterface` if it has been paused. Example usage: interface.question('What is your favorite food?', function(answer) { console.log('Oh, so your favorite food is ' + answer); }); ### rl.pause() Pauses the readline `in` stream, allowing it to be resumed later if needed. ### rl.resume() Resumes the readline `in` stream. ### rl.write() Writes to tty. This will also resume the `in` stream used with `createInterface` if it has been paused. ### Event: 'line' `function (line) {}` Emitted whenever the `in` stream receives a `\n`, usually received when the user hits enter, or return. This is a good hook to listen for user input. Example of listening for `line`: rl.on('line', function (cmd) { console.log('You just typed: '+cmd); }); ### Event: 'pause' `function () {}` Emitted whenever the `in` stream is paused or receives `^D`, respectively known as `EOT`. This event is also called if there is no `SIGINT` event listener present when the `in` stream receives a `^C`, respectively known as `SIGINT`. Also emitted whenever the `in` stream is not paused and receives the `SIGCONT` event. (See events `SIGTSTP` and `SIGCONT`) Example of listening for `pause`: rl.on('pause', function() { console.log('Readline paused.'); }); ### Event: 'resume' `function () {}` Emitted whenever the `in` stream is resumed. Example of listening for `resume`: rl.on('resume', function() { console.log('Readline resumed.'); }); ### Event: 'SIGINT' `function () {}` Emitted whenever the `in` stream receives a `^C`, respectively known as `SIGINT`. If there is no `SIGINT` event listener present when the `in` stream receives a `SIGINT`, `pause` will be triggered. Example of listening for `SIGINT`: 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 () {}` **This does not work on Windows.** Emitted whenever the `in` stream receives a `^Z`, respectively known as `SIGTSTP`. If there is no `SIGTSTP` event listener present when the `in` stream receives a `SIGTSTP`, the program will be sent to the background. When the program is resumed with `fg`, the `pause` and `SIGCONT` events will be emitted. You can use either to resume the stream. The `pause` and `SIGCONT` events will not be triggered if the stream was paused before the program was sent to the background. Example of listening for `SIGTSTP`: rl.on('SIGTSTP', function() { // This will override SIGTSTP and prevent the program from going to the // background. console.log('Caught SIGTSTP.'); }); ### Event: 'SIGCONT' `function () {}` **This does not work on Windows.** Emitted whenever the `in` stream is sent to the background with `^Z`, respectively known as `SIGTSTP`, and then continued with `fg`. This event only emits if the stream was not paused before sending the program to the background. Example of listening for `SIGCONT`: rl.on('SIGCONT', function() { // `prompt` will automatically resume the stream rl.prompt(); }); Here's an example of how to use all these together to craft a tiny command line interface: 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('pause', function() { console.log('Have a great day!'); process.exit(0); });