]> granicus.if.org Git - vim/commitdiff
patch 8.2.0421: interrupting with CTRL-C does not always work v8.2.0421
authorBram Moolenaar <Bram@vim.org>
Fri, 20 Mar 2020 19:48:49 +0000 (20:48 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 20 Mar 2020 19:48:49 +0000 (20:48 +0100)
Problem:    Interrupting with CTRL-C does not always work.
Solution:   Recognize CTRL-C while modifyOtherKeys is set.

src/evalfunc.c
src/testdir/test_vim9_script.vim
src/ui.c
src/version.c

index 9a6187b20af237177d68daaafac73018bcb2f924..0f99c6dab8e835300ec26b3c57be400364f049f5 100644 (file)
@@ -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
index 2f87ba7c7c96a1a305f801dae8f54a91516986e5..c83012176394ce52dc5f7c1a6ff3ce87733c2857 100644 (file)
@@ -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
index 393bf91f294c4052e61d0f9403138f6e41a29671..420eb7dae47c00d6bc916eb29034ce3097fab7e4 100644 (file)
--- 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));
index 1ad99cfd1336946fb31d2b86880e036d4d1bb179..986a29feb02c373b886ae2a234677daa46b09056 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    421,
 /**/
     420,
 /**/