diff options
author | Anna Henningsen <anna@addaleax.net> | 2016-07-15 23:33:16 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2016-08-04 23:32:38 +0200 |
commit | 1a9e247c794274942683d2e77db098c9494ddde5 (patch) | |
tree | 8bf3d4e32e050824f01f484c0af443ea6641e8f2 /lib/readline.js | |
parent | c809b8834541bf63b1a43d5a12833d98ffba834f (diff) | |
download | android-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.js | 28 |
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 |