changeset 32045:55926b4f2246 v9.0.1354

patch 9.0.1354: "gr CTRL-G" stays in virtual replace mode Commit: https://github.com/vim/vim/commit/d6a4ea3aa0d3f4a886ea900e94bf4e8ca8ae8d63 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Feb 25 14:24:44 2023 +0000 patch 9.0.1354: "gr CTRL-G" stays in virtual replace mode Problem: "gr CTRL-G" stays in virtual replace mode. (Pierre Ganty) Solution: Prepend CTRL-V before control characters. (closes https://github.com/vim/vim/issues/12045)
author Bram Moolenaar <Bram@vim.org>
date Sat, 25 Feb 2023 15:30:02 +0100
parents 44d0d4a6d967
children 4aa1cf7e887d
files src/edit.c src/normal.c src/testdir/test_edit.vim src/version.c
diffstat 4 files changed, 16 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/edit.c
+++ b/src/edit.c
@@ -3527,6 +3527,10 @@ ins_ctrl_g(void)
 		  dont_sync_undo = MAYBE;
 		  break;
 
+	case ESC:
+		  // Esc after CTRL-G cancels it.
+		  break;
+
 	// Unknown CTRL-G command, reserved for future expansion.
 	default:  vim_beep(BO_CTRLG);
     }
--- a/src/normal.c
+++ b/src/normal.c
@@ -5033,6 +5033,10 @@ nv_vreplace(cmdarg_T *cap)
     {
 	if (cap->extra_char == Ctrl_V)	// get another character
 	    cap->extra_char = get_literal(FALSE);
+	if (cap->extra_char < ' ')
+	    // Prefix a control character with CTRL-V to avoid it being used as
+	    // a command.
+	    stuffcharReadbuff(Ctrl_V);
 	stuffcharReadbuff(cap->extra_char);
 	stuffcharReadbuff(ESC);
 	if (virtual_active())
--- a/src/testdir/test_edit.vim
+++ b/src/testdir/test_edit.vim
@@ -2068,8 +2068,12 @@ endfunc
 func Test_edit_gr_special()
   enew
   call setline(1, ['abcdef', 'xxxxxx'])
-  exe "normal! gr\<C-O>x"
-  call assert_equal('bcdef', getline(1))
+  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
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1354,
+/**/
     1353,
 /**/
     1352,