summaryrefslogtreecommitdiff
path: root/lib/readline.js
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2016-07-15 23:33:16 +0200
committerAnna Henningsen <anna@addaleax.net>2016-08-04 23:32:38 +0200
commit1a9e247c794274942683d2e77db098c9494ddde5 (patch)
tree8bf3d4e32e050824f01f484c0af443ea6641e8f2 /lib/readline.js
parentc809b8834541bf63b1a43d5a12833d98ffba834f (diff)
downloadandroid-node-v8-1a9e247c794274942683d2e77db098c9494ddde5.tar.gz
android-node-v8-1a9e247c794274942683d2e77db098c9494ddde5.tar.bz2
android-node-v8-1a9e247c794274942683d2e77db098c9494ddde5.zip
readline: show completions only after 2nd TAB
Show `TAB` completion suggestions only after the user has pressed `TAB` twice in a row, so that the full list of suggestions doesn’t present a distraction. The first time a `TAB` key is pressed, only partial longest-common-prefix completion is performed. This moves the `readline` autocompletion a lot closer to what e.g. `bash` does. Fixes: https://github.com/nodejs/node/issues/7665 PR-URL: https://github.com/nodejs/node/pull/7754 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Trevor Norris <trev.norris@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib/readline.js')
-rw-r--r--lib/readline.js28
1 files changed, 15 insertions, 13 deletions
diff --git a/lib/readline.js b/lib/readline.js
index 402923e925..9d34bb740d 100644
--- a/lib/readline.js
+++ b/lib/readline.js
@@ -41,6 +41,7 @@ function Interface(input, output, completer, terminal) {
this._sawReturn = false;
this.isCompletionEnabled = true;
+ this._previousKey = null;
EventEmitter.call(this);
var historySize;
@@ -391,7 +392,7 @@ Interface.prototype._insertString = function(c) {
}
};
-Interface.prototype._tabComplete = function() {
+Interface.prototype._tabComplete = function(lastKeypressWasTab) {
var self = this;
self.pause();
@@ -407,9 +408,7 @@ Interface.prototype._tabComplete = function() {
const completeOn = rv[1]; // the text that was completed
if (completions && completions.length) {
// Apply/show completions.
- if (completions.length === 1) {
- self._insertString(completions[0].slice(completeOn.length));
- } else {
+ if (lastKeypressWasTab) {
self._writeToOutput('\r\n');
var width = completions.reduce(function(a, b) {
return a.length > b.length ? a : b;
@@ -429,16 +428,15 @@ Interface.prototype._tabComplete = function() {
}
}
handleGroup(self, group, width, maxColumns);
+ }
- // If there is a common prefix to all matches, then apply that
- // portion.
- var f = completions.filter(function(e) { if (e) return e; });
- var prefix = commonPrefix(f);
- if (prefix.length > completeOn.length) {
- self._insertString(prefix.slice(completeOn.length));
- }
-
+ // If there is a common prefix to all matches, then apply that portion.
+ const f = completions.filter(function(e) { if (e) return e; });
+ const prefix = commonPrefix(f);
+ if (prefix.length > completeOn.length) {
+ self._insertString(prefix.slice(completeOn.length));
}
+
self._refreshLine();
}
});
@@ -474,6 +472,7 @@ function commonPrefix(strings) {
if (!strings || strings.length == 0) {
return '';
}
+ if (strings.length === 1) return strings[0];
var sorted = strings.slice().sort();
var min = sorted[0];
var max = sorted[sorted.length - 1];
@@ -688,7 +687,9 @@ Interface.prototype._moveCursor = function(dx) {
// handle a write from the tty
Interface.prototype._ttyWrite = function(s, key) {
+ const previousKey = this._previousKey;
key = key || {};
+ this._previousKey = key;
// Ignore escape key - Fixes #2876
if (key.name == 'escape') return;
@@ -892,7 +893,8 @@ Interface.prototype._ttyWrite = function(s, key) {
case 'tab':
// If tab completion enabled, do that...
if (typeof this.completer === 'function' && this.isCompletionEnabled) {
- this._tabComplete();
+ const lastKeypressWasTab = previousKey && previousKey.name === 'tab';
+ this._tabComplete(lastKeypressWasTab);
break;
}
// falls through