Browse Source

readline: fix tab completion bug

This fixes a problem where tab completion is empty when the input
stream column size is undefined. As a solution we can force maxColumns
to 1 in this scenario.

PR-URL: https://github.com/nodejs/node/pull/2816
Fixes: https://github.com/nodejs/node/issues/2396
Reviewed-By: Roman Reiss <me@silverwind.io>
v5.x
Matt Harrison 9 years ago
committed by Roman Reiss
parent
commit
e29e470c14
  1. 5
      lib/readline.js
  2. 36
      test/parallel/test-readline-undefined-columns.js

5
lib/readline.js

@ -390,7 +390,10 @@ Interface.prototype._tabComplete = function() {
var width = completions.reduce(function(a, b) {
return a.length > b.length ? a : b;
}).length + 2; // 2 space padding
var maxColumns = Math.floor(self.columns / width) || 1;
var maxColumns = Math.floor(self.columns / width);
if (!maxColumns || maxColumns === Infinity) {
maxColumns = 1;
}
var group = [], c;
for (var i = 0, compLen = completions.length; i < compLen; i++) {
c = completions[i];

36
test/parallel/test-readline-undefined-columns.js

@ -0,0 +1,36 @@
'use strict';
const assert = require('assert');
const PassThrough = require('stream').PassThrough;
const readline = require('readline');
// Checks that tab completion still works
// when output column size is undefined
const iStream = new PassThrough();
const oStream = new PassThrough();
const rli = readline.createInterface({
terminal: true,
input: iStream,
output: oStream,
completer: function(line, cb) {
cb(null, [['process.stdout', 'process.stdin', 'process.stderr'], line]);
}
});
var output = '';
oStream.on('data', function(data) {
output += data;
});
oStream.on('end', function() {
const expect = 'process.stdout\r\n' +
'process.stdin\r\n' +
'process.stderr';
assert(new RegExp(expect).test(output));
});
iStream.write('process.std\t');
oStream.end();
Loading…
Cancel
Save