From 7f11c72cc5ef7507d52976b7efeec631d9490662 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Thu, 15 Aug 2019 12:37:29 -0400 Subject: [PATCH] readline: close dumb terminals on Control+D This commit adds support for closing a readline interface on Control+D when the terminal is dumb. PR-URL: https://github.com/nodejs/node/pull/29149 Fixes: https://github.com/nodejs/node/issues/29111 Reviewed-By: Ben Noordhuis Reviewed-By: James M Snell Reviewed-By: Luigi Pinca --- lib/readline.js | 19 ++++++++++++------- test/pseudo-tty/repl-dumb-tty.js | 18 +++++++++++++++++- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/lib/readline.js b/lib/readline.js index 8c02a89567489b..feffb5592b1b50 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -816,15 +816,20 @@ function _ttyWriteDumb(s, key) { if (this._sawReturnAt && key.name !== 'enter') this._sawReturnAt = 0; - if (key.ctrl && key.name === 'c') { - if (this.listenerCount('SIGINT') > 0) { - this.emit('SIGINT'); - } else { - // This readline instance is finished + if (key.ctrl) { + if (key.name === 'c') { + if (this.listenerCount('SIGINT') > 0) { + this.emit('SIGINT'); + } else { + // This readline instance is finished + this.close(); + } + + return; + } else if (key.name === 'd') { this.close(); + return; } - - return; } switch (key.name) { diff --git a/test/pseudo-tty/repl-dumb-tty.js b/test/pseudo-tty/repl-dumb-tty.js index 08c63881d38b97..1a3a24299821fe 100644 --- a/test/pseudo-tty/repl-dumb-tty.js +++ b/test/pseudo-tty/repl-dumb-tty.js @@ -1,9 +1,10 @@ 'use strict'; -require('../common'); +const common = require('../common'); process.env.TERM = 'dumb'; const repl = require('repl'); +const ArrayStream = require('../common/arraystream'); repl.start('> '); process.stdin.push('console.log("foo")\n'); @@ -13,3 +14,18 @@ process.stdin.push('console.dir({ a: 1 })\n'); process.stdin.push('{ a: 1 }\n'); process.stdin.push('\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' }); +}