|
|
@ -130,9 +130,11 @@ function Interface(input, output, completer, terminal) { |
|
|
|
|
|
|
|
// Check arity, 2 - for async, 1 for sync
|
|
|
|
if (typeof completer === 'function') { |
|
|
|
this.completer = completer.length === 2 ? completer : function(v, cb) { |
|
|
|
cb(null, completer(v)); |
|
|
|
}; |
|
|
|
this.completer = completer.length === 2 ? |
|
|
|
completer : |
|
|
|
function completerWrapper(v, cb) { |
|
|
|
cb(null, completer(v)); |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
this.setPrompt(prompt); |
|
|
@ -175,15 +177,23 @@ function Interface(input, output, completer, terminal) { |
|
|
|
} |
|
|
|
|
|
|
|
if (!this.terminal) { |
|
|
|
input.on('data', ondata); |
|
|
|
input.on('end', onend); |
|
|
|
self.once('close', function() { |
|
|
|
function onSelfCloseWithoutTerminal() { |
|
|
|
input.removeListener('data', ondata); |
|
|
|
input.removeListener('end', onend); |
|
|
|
}); |
|
|
|
this._decoder = new StringDecoder('utf8'); |
|
|
|
} |
|
|
|
|
|
|
|
input.on('data', ondata); |
|
|
|
input.on('end', onend); |
|
|
|
self.once('close', onSelfCloseWithoutTerminal); |
|
|
|
this._decoder = new StringDecoder('utf8'); |
|
|
|
} else { |
|
|
|
function onSelfCloseWithTerminal() { |
|
|
|
input.removeListener('keypress', onkeypress); |
|
|
|
input.removeListener('end', ontermend); |
|
|
|
if (output !== null && output !== undefined) { |
|
|
|
output.removeListener('resize', onresize); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
emitKeypressEvents(input, this); |
|
|
|
|
|
|
@ -206,13 +216,7 @@ function Interface(input, output, completer, terminal) { |
|
|
|
if (output !== null && output !== undefined) |
|
|
|
output.on('resize', onresize); |
|
|
|
|
|
|
|
self.once('close', function() { |
|
|
|
input.removeListener('keypress', onkeypress); |
|
|
|
input.removeListener('end', ontermend); |
|
|
|
if (output !== null && output !== undefined) { |
|
|
|
output.removeListener('resize', onresize); |
|
|
|
} |
|
|
|
}); |
|
|
|
self.once('close', onSelfCloseWithTerminal); |
|
|
|
} |
|
|
|
|
|
|
|
input.resume(); |
|
|
@ -460,7 +464,7 @@ Interface.prototype._tabComplete = function(lastKeypressWasTab) { |
|
|
|
var self = this; |
|
|
|
|
|
|
|
self.pause(); |
|
|
|
self.completer(self.line.slice(0, self.cursor), function(err, rv) { |
|
|
|
self.completer(self.line.slice(0, self.cursor), function onComplete(err, rv) { |
|
|
|
self.resume(); |
|
|
|
|
|
|
|
if (err) { |
|
|
@ -474,7 +478,7 @@ Interface.prototype._tabComplete = function(lastKeypressWasTab) { |
|
|
|
// Apply/show completions.
|
|
|
|
if (lastKeypressWasTab) { |
|
|
|
self._writeToOutput('\r\n'); |
|
|
|
var width = completions.reduce(function(a, b) { |
|
|
|
var width = completions.reduce(function completionReducer(a, b) { |
|
|
|
return a.length > b.length ? a : b; |
|
|
|
}).length + 2; // 2 space padding
|
|
|
|
var maxColumns = Math.floor(self.columns / width); |
|
|
@ -495,7 +499,9 @@ Interface.prototype._tabComplete = function(lastKeypressWasTab) { |
|
|
|
} |
|
|
|
|
|
|
|
// If there is a common prefix to all matches, then apply that portion.
|
|
|
|
var f = completions.filter(function(e) { if (e) return e; }); |
|
|
|
var f = completions.filter(function completionFilter(e) { |
|
|
|
if (e) return e; |
|
|
|
}); |
|
|
|
var prefix = commonPrefix(f); |
|
|
|
if (prefix.length > completeOn.length) { |
|
|
|
self._insertString(prefix.slice(completeOn.length)); |
|
|
|