From: Bram Moolenaar Date: Fri, 20 Mar 2020 19:48:49 +0000 (+0100) Subject: patch 8.2.0421: interrupting with CTRL-C does not always work X-Git-Tag: v8.2.0421 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9645e2d9fc8a591f1db30383caccf71d40e0810c;p=vim patch 8.2.0421: interrupting with CTRL-C does not always work Problem: Interrupting with CTRL-C does not always work. Solution: Recognize CTRL-C while modifyOtherKeys is set. --- diff --git a/src/evalfunc.c b/src/evalfunc.c index 9a6187b20..0f99c6dab 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2472,7 +2472,17 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED) if (lowlevel) { #ifdef USE_INPUT_BUF - add_to_input_buf(keys, (int)STRLEN(keys)); + int idx; + int len = (int)STRLEN(keys); + + for (idx = 0; idx < len; ++idx) + { + // if a CTRL-C was typed, set got_int, similar to what + // happens in fill_input_buf() + if (keys[idx] == 3 && ctrl_c_interrupts && typed) + got_int = TRUE; + add_to_input_buf(keys + idx, 1); + } #else emsg(_("E980: lowlevel input not supported")); #endif diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 2f87ba7c7..c83012176 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -942,15 +942,15 @@ def Test_while_loop() assert_equal('1_3_', result) enddef -" def Test_interrupt_loop() -" let x = 0 -" while 1 -" x += 1 -" if x == 100 -" feedkeys("\", 'L') -" endif -" endwhile -" enddef +def Test_interrupt_loop() + let x = 0 + while 1 + x += 1 + if x == 100 + feedkeys("\", 'Lt') + endif + endwhile +enddef def Test_substitute_cmd() new diff --git a/src/ui.c b/src/ui.c index 393bf91f2..420eb7dae 100644 --- a/src/ui.c +++ b/src/ui.c @@ -2280,7 +2280,7 @@ fill_input_buf(int exit_on_error UNUSED) for (try = 0; try < 100; ++try) { size_t readlen = (size_t)((INBUFLEN - inbufcount) - / input_conv.vc_factor); + / input_conv.vc_factor); # ifdef VMS len = vms_read((char *)inbuf + inbufcount, readlen); # else @@ -2344,9 +2344,12 @@ fill_input_buf(int exit_on_error UNUSED) while (len-- > 0) { /* - * if a CTRL-C was typed, remove it from the buffer and set got_int + * If a CTRL-C was typed, remove it from the buffer and set + * got_int. Also recognize CTRL-C with modifyOtherKeys set. */ - if (inbuf[inbufcount] == 3 && ctrl_c_interrupts) + if (ctrl_c_interrupts && (inbuf[inbufcount] == 3 + || (len >= 9 && STRNCMP(inbuf + inbufcount, + "\e[27;5;99~", 10) == 0))) { // remove everything typed before the CTRL-C mch_memmove(inbuf, inbuf + inbufcount, (size_t)(len + 1)); diff --git a/src/version.c b/src/version.c index 1ad99cfd1..986a29feb 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 421, /**/ 420, /**/