lib: repl multiline history support

PR-URL: https://github.com/nodejs/node/pull/22153
Reviewed-By: John-David Dalton <john.david.dalton@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Anto Aravinth 2018-11-01 22:16:01 +05:30 committed by Rich Trott
parent 65fe999ed7
commit dd7a3d246d
3 changed files with 34 additions and 0 deletions

View File

@ -217,6 +217,7 @@ function Interface(input, output, completer, terminal) {
// Current line
this.line = '';
this.multiline = '';
this._setRawMode(true);
this.terminal = true;
@ -327,6 +328,7 @@ Interface.prototype._addHistory = function() {
if (dupIndex !== -1) this.history.splice(dupIndex, 1);
}
this.multiline += this.line;
this.history.unshift(this.line);
// Only store so many
@ -337,6 +339,29 @@ Interface.prototype._addHistory = function() {
return this.history[0];
};
// Called when a multiline is seen by the repl
Interface.prototype.undoHistory = function() {
if (this.terminal) {
this.history.shift();
}
};
// If it's a multiline code, then add history
// accordingly.
Interface.prototype.multilineHistory = function() {
// check if we got a multiline code
if (this.multiline !== '' && this.terminal) {
const dupIndex = this.history.indexOf(this.multiline);
if (dupIndex !== -1) this.history.splice(dupIndex, 1);
// Remove the last entered line as multiline
// already contains them.
this.history.shift();
this.history.unshift(this.multiline);
}
// clear the multiline buffer
this.multiline = '';
};
Interface.prototype._refreshLine = function() {
// line length

View File

@ -779,6 +779,7 @@ exports.start = function(prompt,
REPLServer.prototype.clearBufferedCommand = function clearBufferedCommand() {
this[kBufferedCommandSymbol] = '';
REPLServer.super_.prototype.multilineHistory.call(this);
};
REPLServer.prototype.close = function close() {
@ -893,6 +894,7 @@ REPLServer.prototype.displayPrompt = function(preserveCursor) {
const len = this.lines.level.length ? this.lines.level.length - 1 : 0;
const levelInd = '..'.repeat(len);
prompt += levelInd + ' ';
REPLServer.super_.prototype.undoHistory.call(this);
}
// Do not overwrite `_initialPrompt` here

View File

@ -111,6 +111,13 @@ const tests = [
test: [UP],
expected: [prompt, replFailedRead, prompt, replDisabled, prompt]
},
{ // Tests multiline history
env: {},
test: ['{', '}', UP, CLEAR],
expected: [prompt, '{', '... ', '}', '{}\n',
prompt, `${prompt}{}`, prompt],
clean: false
},
{
before: function before() {
if (common.isWindows) {