Skip to content

Commit afe8eea

Browse files
committed
repl: add cls command
repl: add cls command `.cls` will clear the current repl screen
1 parent d1d5da2 commit afe8eea

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

doc/api/repl.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ The following special commands are supported by all REPL instances:
3939
further input or processing of that expression.
4040
* `.clear`: Resets the REPL `context` to an empty object and clears any
4141
multi-line expression being input.
42+
* `.cls`: Clear the screen (or press <kbd>Ctrl</kbd>+<kbd>L</kbd>).
4243
* `.exit`: Close the I/O stream, causing the REPL to exit.
4344
* `.help`: Show this list of special commands.
4445
* `.save`: Save the current REPL session to a file:

lib/repl.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,11 @@ const {
190190
const {
191191
makeContextifyScript,
192192
} = require('internal/vm');
193+
const {
194+
clearScreenDown,
195+
cursorTo,
196+
} = require('internal/readline/callbacks');
197+
193198
let nextREPLResourceNumber = 1;
194199
// This prevents v8 code cache from getting confused and using a different
195200
// cache from a resource of the same name
@@ -1821,6 +1826,16 @@ function defineDefaultCommands(repl) {
18211826
this.displayPrompt();
18221827
},
18231828
});
1829+
1830+
repl.defineCommand('cls', {
1831+
help: 'Clear the screen',
1832+
action: function() {
1833+
cursorTo(this.output, 0, 0);
1834+
clearScreenDown(this.output);
1835+
this.displayPrompt();
1836+
},
1837+
});
1838+
18241839
if (repl.terminal) {
18251840
repl.defineCommand('editor', {
18261841
help: 'Enter editor mode',
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
const repl = require('repl');
6+
const ArrayStream = require('../common/arraystream');
7+
8+
// eslint-disable-next-line no-control-regex
9+
const clearChar = /\[1;1H\u001b\[0J>/;
10+
let accum = '';
11+
const output = new ArrayStream();
12+
output.write = (data) => (accum += data.replace('\r', ''));
13+
14+
const r = repl.start({
15+
input: new ArrayStream(),
16+
output,
17+
});
18+
['new Error', 'Promise'].forEach((cmd) => r.write(`${cmd}\n`));
19+
assert.strictEqual(accum.match(clearChar), null);
20+
r.write('.cls\n');
21+
assert.strictEqual(accum.match(clearChar).length > 0, true);
22+
r.write('.exit\n');

test/parallel/test-repl.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ const errorTests = [
458458
expect: [
459459
/\.break/,
460460
/\.clear/,
461+
/\.cls/,
461462
/\.exit/,
462463
/\.help/,
463464
/\.load/,

0 commit comments

Comments
 (0)