emersion / mrsh

A minimal POSIX shell
MIT License
492 stars 35 forks source link

SIGINT handling on multiline PS1 #202

Open cubernetes opened 6 months ago

cubernetes commented 6 months ago

Sending an interrupt signal to mrsh while having a multline prompt redraws the prompt incorrectly:

PS1="$(printf 'line1\nline2: ')" ./mrsh
line1
line2: ^C
line2:

One way that seems to work is to add rl_reset_line_state() before rl_replace_line() in sigint_handler.

Another hacky way is to set the readline variable rl_event_hook to a no-op function (e.g. static int no_op(void) { return 0; }) and when handling the signal interrupt (in static void sigint_handler()), the only thing you do is set the readline variable rl_done to 1.