From adc06dd70566c9909fa4d61aedac1181b2ddfbba Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Tue, 8 Jun 2010 13:05:21 -0700 Subject: [PATCH] Add NODE_NO_READLINE check for REPL Setting this environmental variable to a non-zero integer will start all REPL interfaces without readline. For use with rlwrap. --- doc/api.markdown | 42 ++++++++++++------------------------------ lib/readline.js | 19 ++++++++++++------- lib/repl.js | 3 +-- 3 files changed, 25 insertions(+), 39 deletions(-) diff --git a/doc/api.markdown b/doc/api.markdown index c9a2add9d8f..be4cd381768 100644 --- a/doc/api.markdown +++ b/doc/api.markdown @@ -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 ] @@ -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) @@ -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. diff --git a/lib/readline.js b/lib/readline.js index 7303bfb3c47..d949e58d444 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -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; diff --git a/lib/repl.js b/lib/repl.js index 1fa3ed576ce..9c27e4e9118 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -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) {