diff --git a/lib/readline.js b/lib/readline.js index 5cc22938821..b9e61beed08 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -732,8 +732,9 @@ Interface.prototype._getDisplayPos = function(str) { i++; } if (code === 0x0a) { // new line \n + // row must be incremented by 1 even if offset = 0 or col = +Infinity + row += Math.ceil(offset / col) || 1; offset = 0; - row += 1; continue; } const width = getStringWidth(code); diff --git a/test/parallel/test-readline-interface.js b/test/parallel/test-readline-interface.js index 93c4b12511e..6c514973885 100644 --- a/test/parallel/test-readline-interface.js +++ b/test/parallel/test-readline-interface.js @@ -1062,7 +1062,7 @@ function isWarned(emitter) { rli.close(); } - // multi-line cursor position + // Multi-line input cursor position { const fi = new FakeInput(); const rli = new readline.Interface({ @@ -1079,6 +1079,23 @@ function isWarned(emitter) { rli.close(); } + // Multi-line prompt cursor position + { + const fi = new FakeInput(); + const rli = new readline.Interface({ + input: fi, + output: fi, + prompt: '\nfilledline\nwraping text\n> ', + terminal: terminal + }); + fi.columns = 10; + fi.emit('data', 't'); + const cursorPos = rli._getCursorPos(); + assert.strictEqual(cursorPos.rows, 4); + assert.strictEqual(cursorPos.cols, 3); + rli.close(); + } + // Clear the whole screen { const fi = new FakeInput();