summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-03-20 20:48:49 +0100
committerBram Moolenaar <Bram@vim.org>2020-03-20 20:48:49 +0100
commit9645e2d9fc8a591f1db30383caccf71d40e0810c (patch)
tree8b8d4d8374a9c5d2f0f0ce71893d75cfc427f4bc
parentf1ec378b014efb9897422c40369a6462163a512a (diff)
patch 8.2.0421: interrupting with CTRL-C does not always workv8.2.0421
Problem: Interrupting with CTRL-C does not always work. Solution: Recognize CTRL-C while modifyOtherKeys is set.
-rw-r--r--src/evalfunc.c12
-rw-r--r--src/testdir/test_vim9_script.vim18
-rw-r--r--src/ui.c9
-rw-r--r--src/version.c2
4 files changed, 28 insertions, 13 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 9a6187b20a..0f99c6dab8 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 2f87ba7c7c..c830121763 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("\<C-C>", 'L')
-" endif
-" endwhile
-" enddef
+def Test_interrupt_loop()
+ let x = 0
+ while 1
+ x += 1
+ if x == 100
+ feedkeys("\<C-C>", 'Lt')
+ endif
+ endwhile
+enddef
def Test_substitute_cmd()
new
diff --git a/src/ui.c b/src/ui.c
index 393bf91f29..420eb7dae4 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 1ad99cfd13..986a29feb0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 421,
+/**/
420,
/**/
419,