Skip to content

Commit

Permalink
Add NODE_NO_READLINE check for REPL
Browse files Browse the repository at this point in the history
Setting this environmental variable to a non-zero integer will start all
REPL interfaces without readline. For use with rlwrap.
  • Loading branch information
ry committed Jun 8, 2010
1 parent 0377b12 commit adc06dd
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 39 deletions.
42 changes: 12 additions & 30 deletions doc/api.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -2760,21 +2760,18 @@ The escape function used by `querystring.stringify`, provided so that it could b

The unescape function used by `querystring.parse`, provided so that it could be overridden if necessary.


## REPL

A Read-Eval-Print-Loop is available both as a standalone program and easily
A Read-Eval-Print-Loop (REPL) is available both as a standalone program and easily
includable in other programs. REPL provides a way to interactively run
JavaScript and see the results. It can be used for debugging, testing, or
just trying things out.

The standalone REPL is called `node-repl` and is installed at
`$PREFIX/bin/node-repl`.
By executing `node` without any arguments from the command-line you will be
dropped into the REPL. It has simplistic emacs line-editting.

mjr:~$ /usr/local/bin/node-repl
Welcome to the Node.js REPL.
Enter ECMAScript at the prompt.
Tip 1: Use 'rlwrap node-repl' for a better interface
Tip 2: Type Control-D to exit.
mjr:~$ node
Type '.help' for options.
node> a = [ 1, 2, 3];
[ 1, 2, 3 ]
Expand All @@ -2785,6 +2782,13 @@ The standalone REPL is called `node-repl` and is installed at
2
3

For advanced line-editors, start node with the environmental variable `NODE_NO_READLINE=1`.
This will start the REPL in canonical terminal settings which will allow you to use with `rlwrap`.

For example, you could add this to your bashrc file:

alias node="env NODE_NO_READLINE=1 rlwrap node"


### repl.start(prompt, stream)

Expand Down Expand Up @@ -2824,28 +2828,6 @@ By starting a REPL from a Unix socket-based server instead of stdin, you can
connect to a long-running node process without restarting it.


### readline support

Interactive command history for REPL is available from external programs like `rlwrap`
or `socat`. These programs are available from many Unix package managers.

To start the standalone REPL with `rlwrap`:

rlwrap node-repl

It might be convenient to use this alias in your shell configuration:

alias repl='rlwrap node-repl'

Using `socat` to connect to a Unix socket:

socat READLINE UNIX-CONNECT:/tmp/node-repl-sock

Using `socat` to connect to a TCP socket on localhost:

socat READLINE TCP-CONNECT:localhost:5001


### REPL Features

Inside the REPL, Control+D will exit. Multi-line expressions can be input.
Expand Down
19 changes: 12 additions & 7 deletions lib/readline.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,34 @@ var kBufSize = 10*1024;


var Buffer = require('buffer').Buffer;
var sys = require('sys');
var inherits = require('sys').inherits;
var EventEmitter = require('events').EventEmitter;
var stdio = process.binding('stdio');



exports.createInterface = function (output, isTTY) {
return new Interface(output, isTTY);
exports.createInterface = function (output) {
return new Interface(output);
};

function Interface (output, isTTY) {
function Interface (output) {
this.output = output;

this.setPrompt("node> ");

// Current line
this.line = ""
this._tty = output.fd < 3;

if (!isTTY) {
if (parseInt(process.env['NODE_NO_READLINE'])) {
this._tty = false;
} else {
}

if (this._tty) {
// input refers to stdin

// Current line
this.line = "";

// Check process.env.TERM ?
stdio.setRawMode(true);
this._tty = true;
Expand Down
3 changes: 1 addition & 2 deletions lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,7 @@ function REPLServer(prompt, stream) {
self.stream = stream || process.openStdin();
self.prompt = prompt || "node> ";

var isTTY = (self.stream.fd < 3);
var rli = self.rli = rl.createInterface(self.stream, isTTY);
var rli = self.rli = rl.createInterface(self.stream);
rli.setPrompt(self.prompt);

self.stream.addListener("data", function (chunk) {
Expand Down

0 comments on commit adc06dd

Please sign in to comment.