]> granicus.if.org Git - vim/commitdiff
patch 9.0.1356: cannot cancel "gr" with Esc v9.0.1356
authorzeertzjq <zeertzjq@outlook.com>
Sun, 26 Feb 2023 14:47:24 +0000 (14:47 +0000)
committerBram Moolenaar <Bram@vim.org>
Sun, 26 Feb 2023 14:47:24 +0000 (14:47 +0000)
Problem:    Cannot cancel "gr" with Esc.
Solution:   Make "gr<Esc>" do nothing. (closes #12064)

src/edit.c
src/normal.c
src/testdir/test_edit.vim
src/testdir/test_normal.vim
src/version.c

index ff9fc0ed0fb93490a15ee1de1cfb3eaff742f66c..212efae3d4e6213916ba7bca8598007537ca9108 100644 (file)
@@ -45,7 +45,7 @@ static void ins_ctrl_(void);
 #endif
 static int ins_start_select(int c);
 static void ins_insert(int replaceState);
-static void ins_ctrl_o(int cmdchar);
+static void ins_ctrl_o(void);
 static void ins_shift(int c, int lastc);
 static void ins_del(void);
 static int  ins_bs(int c, int mode, int *inserted_space_p);
@@ -429,8 +429,7 @@ edit(
     /*
      * Main loop in Insert mode: repeat until Insert mode is left.
      */
-    int did_loop = FALSE;
-    for (;; did_loop = TRUE)
+    for (;;)
     {
 #ifdef FEAT_RIGHTLEFT
        if (!revins_legal)
@@ -589,8 +588,6 @@ edit(
        if (cmdchar == K_PS)
            // Got here from normal mode when bracketed paste started.
            c = K_PS;
-       else if (cmdchar == 'v' && did_loop && count <= 0)
-           c = ESC;  // in case the stuffed Esc was consumed already
        else
            do
            {
@@ -720,7 +717,7 @@ edit(
            {
                if (c == Ctrl_O)
                {
-                   ins_ctrl_o(cmdchar);
+                   ins_ctrl_o();
                    ins_at_eol = FALSE; // cursor keeps its column
                    nomove = TRUE;
                }
@@ -863,7 +860,7 @@ doESCkey:
 #endif
            if (echeck_abbr(Ctrl_O + ABBR_OFF))
                break;
-           ins_ctrl_o(cmdchar);
+           ins_ctrl_o();
 
            // don't move the cursor left when 'virtualedit' has "onemore".
            if (get_ve_flags() & VE_ONEMORE)
@@ -3855,10 +3852,8 @@ ins_insert(int replaceState)
  * Pressed CTRL-O in Insert mode.
  */
     static void
-ins_ctrl_o(int cmdchar)
+ins_ctrl_o(void)
 {
-    if (cmdchar == 'v')
-       return;  // abort replacing one char for gr CTRL-O
     if (State & VREPLACE_FLAG)
        restart_edit = 'V';
     else if (State & REPLACE_FLAG)
index 95bb1a97d68f650349a710374b350711c04d8e23..da01480ebcae53fe7796fb04797a1a493e6120a8 100644 (file)
@@ -515,7 +515,8 @@ normal_cmd_get_more_chars(
            cap->nchar = cap->extra_char;
            idx = find_command(cap->cmdchar);
        }
-       else if ((cap->nchar == 'n' || cap->nchar == 'N') && cap->cmdchar == 'g')
+       else if ((cap->nchar == 'n' || cap->nchar == 'N')
+                                                       && cap->cmdchar == 'g')
            cap->oap->op_type = get_op_type(*cp, NUL);
        else if (*cp == Ctrl_BSL)
        {
@@ -5024,7 +5025,7 @@ nv_vreplace(cmdarg_T *cap)
        return;
     }
 
-    if (checkclearopq(cap->oap))
+    if (checkclearopq(cap->oap) || cap->extra_char == ESC)
        return;
 
     if (!curbuf->b_p_ma)
index f0896d2c5cbb3d1c4359cf5a7eb6fcd60a47c3a6..79e3c3fd22c8a41f032041dea2f0de4a969095a5 100644 (file)
@@ -573,6 +573,7 @@ func Test_edit_CTRL_G()
   call assert_equal([0, 3, 7, 0], getpos('.'))
   call feedkeys("i\<c-g>j\<esc>", 'tnix')
   call assert_equal([0, 3, 6, 0], getpos('.'))
+  call assert_nobeep("normal! i\<c-g>\<esc>")
   bw!
 endfunc
 
@@ -2064,20 +2065,6 @@ func Test_edit_CTRL_hat()
   bwipe!
 endfunc
 
-" Test "gr" followed by an Insert mode command does get out of Insert mode.
-func Test_edit_gr_special()
-  enew
-  call setline(1, ['abcdef', 'xxxxxx'])
-  exe "normal! gr\<C-O>lx"
-  call assert_equal("\<C-O>def", getline(1))
-
-  call setline(1, 'abcdef')
-  exe "normal! 0gr\<C-G>lx"
-  call assert_equal("\<C-G>def", getline(1))
-
-  bwipe!
-endfunc
-
 " Weird long file name was going over the end of NameBuff
 func Test_edit_overlong_file_name()
   CheckUnix
index 38234cd6c7927310a9ef350f4cabd99dadcc7aca..6db5af76ab3af284e209cc8c293585f4ba46c7a4 100644 (file)
@@ -3273,9 +3273,9 @@ func Test_delete_until_paragraph()
 endfunc
 
 " Test for the gr (virtual replace) command
-" Test for the bug fixed by 7.4.387
 func Test_gr_command()
   enew!
+  " Test for the bug fixed by 7.4.387
   let save_cpo = &cpo
   call append(0, ['First line', 'Second line', 'Third line'])
   exe "normal i\<C-G>u"
@@ -3288,10 +3288,12 @@ func Test_gr_command()
   normal 4gro
   call assert_equal('ooooecond line', getline(2))
   let &cpo = save_cpo
+
   normal! ggvegrx
   call assert_equal('xxxxx line', getline(1))
   exe "normal! gggr\<C-V>122"
   call assert_equal('zxxxx line', getline(1))
+
   set virtualedit=all
   normal! 15|grl
   call assert_equal('zxxxx line    l', getline(1))
@@ -3299,8 +3301,25 @@ func Test_gr_command()
   set nomodifiable
   call assert_fails('normal! grx', 'E21:')
   call assert_fails('normal! gRx', 'E21:')
+  call assert_nobeep("normal! gr\<Esc>")
   set modifiable&
-  enew!
+
+  call assert_nobeep("normal! gr\<Esc>")
+  call assert_beeps("normal! cgr\<Esc>")
+
+  call assert_equal('zxxxx line    l', getline(1))
+  exe "normal! 2|gr\<C-V>\<Esc>"
+  call assert_equal("z\<Esc>xx line    l", getline(1))
+
+  call setline(1, 'abcdef')
+  exe "normal! 0gr\<C-O>lx"
+  call assert_equal("\<C-O>def", getline(1))
+
+  call setline(1, 'abcdef')
+  exe "normal! 0gr\<C-G>lx"
+  call assert_equal("\<C-G>def", getline(1))
+
+  bwipe!
 endfunc
 
 func Test_nv_hat_count()
index 785f76e09945c2fc8c56803e0d9c608396f9fc63..ffe4a8553844eed4b25bb564c73a97067a231281 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1356,
 /**/
     1355,
 /**/