readline: handle input starting with control chars
authorEric Schrock <Eric.Schrock@delphix.com>
Mon, 20 May 2013 18:44:26 +0000 (14:44 -0400)
committerTimothy J Fontaine <tjfontaine@gmail.com>
Mon, 23 Sep 2013 21:22:37 +0000 (14:22 -0700)
Handle control characters only when there is a single byte in the
stream, otherwise fall through to the standard multibyte handling.

lib/readline.js
test/simple/test-readline-interface.js

index 75e51f8..c52f3e8 100644 (file)
@@ -941,7 +941,7 @@ function emitKey(stream, s) {
     key.name = 'space';
     key.meta = (s.length === 2);
 
-  } else if (s <= '\x1a') {
+  } else if (s.length === 1 && s <= '\x1a') {
     // ctrl+letter
     key.name = String.fromCharCode(s.charCodeAt(0) + 'a'.charCodeAt(0) - 1);
     key.ctrl = true;
index fc20d1d..8976b8e 100644 (file)
@@ -155,6 +155,18 @@ FakeInput.prototype.end = function() {};
   assert.equal(callCount, expectedLines.length - 1);
   rli.close();
 
+  // \r at start of input should output blank line
+  fi = new FakeInput();
+  rli = new readline.Interface({ input: fi, output: fi, terminal: true });
+  expectedLines = ['', 'foo' ];
+  callCount = 0;
+  rli.on('line', function(line) {
+    assert.equal(line, expectedLines[callCount]);
+    callCount++;
+  });
+  fi.emit('data', '\rfoo\r');
+  assert.equal(callCount, expectedLines.length);
+  rli.close();
 
   // sending a multi-byte utf8 char over multiple writes
   var buf = Buffer('☮', 'utf8');