Add NODE_NO_READLINE check for REPL
authorRyan Dahl <ry@tinyclouds.org>
Tue, 8 Jun 2010 20:05:21 +0000 (13:05 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Tue, 8 Jun 2010 22:44:43 +0000 (15:44 -0700)
Setting this environmental variable to a non-zero integer will start all
REPL interfaces without readline. For use with rlwrap.

doc/api.markdown
lib/readline.js
lib/repl.js

index c9a2add9d8f8304bc0853c4413093c5be2c84b8e..be4cd381768601d044ed02e8c7fb754d4081391a 100644 (file)
@@ -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.
index 7303bfb3c473ca9f56a70a02d0df36959180b432..d949e58d444d92db1159cc398644d2331f45bfe6 100644 (file)
@@ -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;
index 1fa3ed576ce51e2e2ef7d4be266a39292fa5077a..9c27e4e9118dd47a46da8c05d3c1653eadb91132 100644 (file)
@@ -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) {