changeset 19730:fe8ba2f82f59 v8.2.0421

patch 8.2.0421: interrupting with CTRL-C does not always work Commit: https://github.com/vim/vim/commit/9645e2d9fc8a591f1db30383caccf71d40e0810c Author: Bram Moolenaar <Bram@vim.org> Date: Fri Mar 20 20:48:49 2020 +0100 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.
author Bram Moolenaar <Bram@vim.org>
date Fri, 20 Mar 2020 21:00:05 +0100
parents bc91817dda84
children 02a94f138083
files src/evalfunc.c src/testdir/test_vim9_script.vim src/ui.c src/version.c
diffstat 4 files changed, 28 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -2472,7 +2472,17 @@ f_feedkeys(typval_T *argvars, typval_T *
 	    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
--- 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
--- 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));
--- 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,