readline completions after Control-Z #3295

Closed
josher19 opened this Issue May 21, 2012 · 2 comments

4 participants

@josher19

Sending a script to the background with CTRL-Z (SIGTSTP) and bringing it back to the foreground will result in readline completions behaving strangely.

Related: #2757

There is a simple work-around for node v6.7 :

var tty=require('tty');
tty.setRawMode(false); 
tty.setRawMode(true);

Need to do both. Just doing tty.setRawMode(true) does not fix the problem.

Hopefully this simple fix will also work on node v7.

However, this sometimes results in characters getting echoed to the terminal twice
in some libraries that rely on readline (such as CoffeeScript and LiveScript).

Example of problem & solution:

joshua@jsw-desktop:~$ node
> var tty=require('tty')
undefined
> reset = function() { tty.setRawMode(false); tty.setRawMode(true); }
[Function]
> // hit Ctrl-Z
undefined
> 
[1]+  Stopped                 node
joshua@jsw-desktop:~$ # resume process
joshua@jsw-desktop:~$ fg
node


undefined
> ^P
> // hit Ctrl-Z^N
> ^P^P^P
> // hit Ctrl-Z^P^P
> reset = function() { tty.setRawMode(false); tty.setRawMode(true); }^N
> // hit Ctrl-Z^N
> reset()
reset()
undefined
> // now ^N (next line) and ^P (previous line) work normally
@piscisaureus
Node.js Foundation member
@bnoordhuis
Node.js Foundation member

Confirmed. Happens with master, too.

It's kind of expected: suspending the process and returning control to the shell clobbers the terminal settings. The problem is that SIGSTP and SIGCONT cannot be caught or (reliably) detected.

A workaround is to have the REPL install a check watcher that resets the terminal after each tick of the event loop. That's kind of hackish, though.

@TooTallNate TooTallNate added a commit to TooTallNate/node that referenced this issue May 21, 2012
@TooTallNate TooTallNate readline: explicitly disable and re-enable "raw mode" on Ctrl+Z
Fixes #3295.
ad73e12
@TooTallNate TooTallNate added a commit to TooTallNate/node that referenced this issue May 21, 2012
@TooTallNate TooTallNate repl: preserve the cursor when redisplaying the prompt on SIGCONT
Otherwise the cursor position was being reset to 0, even when there was
already part of a line, which was strange.

Part of #3295.
e770f09
@TooTallNate TooTallNate added a commit that referenced this issue May 22, 2012
@TooTallNate TooTallNate repl: preserve the cursor when redisplaying the prompt on SIGCONT
Otherwise the cursor position was being reset to 0, even when there was
already part of a line, which was strange.

Part of #3295.
a608f65
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment