Skip to content

Commit

Permalink
readline: close dumb terminals on Control+D
Browse files Browse the repository at this point in the history
This commit adds support for closing a readline interface
on Control+D when the terminal is dumb.

PR-URL: #29149
Fixes: #29111
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
  • Loading branch information
cjihrig authored and targos committed Aug 19, 2019
1 parent 3c346b8 commit 7f11c72
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 8 deletions.
19 changes: 12 additions & 7 deletions lib/readline.js
Expand Up @@ -816,15 +816,20 @@ function _ttyWriteDumb(s, key) {
if (this._sawReturnAt && key.name !== 'enter') if (this._sawReturnAt && key.name !== 'enter')
this._sawReturnAt = 0; this._sawReturnAt = 0;


if (key.ctrl && key.name === 'c') { if (key.ctrl) {
if (this.listenerCount('SIGINT') > 0) { if (key.name === 'c') {
this.emit('SIGINT'); if (this.listenerCount('SIGINT') > 0) {
} else { this.emit('SIGINT');
// This readline instance is finished } else {
// This readline instance is finished
this.close();
}

return;
} else if (key.name === 'd') {
this.close(); this.close();
return;
} }

return;
} }


switch (key.name) { switch (key.name) {
Expand Down
18 changes: 17 additions & 1 deletion test/pseudo-tty/repl-dumb-tty.js
@@ -1,9 +1,10 @@
'use strict'; 'use strict';
require('../common'); const common = require('../common');


process.env.TERM = 'dumb'; process.env.TERM = 'dumb';


const repl = require('repl'); const repl = require('repl');
const ArrayStream = require('../common/arraystream');


repl.start('> '); repl.start('> ');
process.stdin.push('console.log("foo")\n'); process.stdin.push('console.log("foo")\n');
Expand All @@ -13,3 +14,18 @@ process.stdin.push('console.dir({ a: 1 })\n');
process.stdin.push('{ a: 1 }\n'); process.stdin.push('{ a: 1 }\n');
process.stdin.push('\n'); process.stdin.push('\n');
process.stdin.push('.exit\n'); process.stdin.push('.exit\n');

// Verify Control+D support.
{
const stream = new ArrayStream();
const replServer = repl.start({
prompt: '> ',
terminal: true,
input: stream,
output: stream,
useColors: false
});

replServer.on('close', common.mustCall());
replServer.write(null, { ctrl: true, name: 'd' });
}

0 comments on commit 7f11c72

Please sign in to comment.