From 2824d1ee325ea61855c26f77e7a4e095b9606720 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 23 Feb 2023 20:13:04 +0000 Subject: [PATCH] patch 9.0.1347: "gr CTRL-O" stays in Insert mode Problem: "gr CTRL-O" stays in Insert mode. (Pierre Ganty) Solution: Do not set restart_edit when "cmdchar" is 'v'. (closes #12045) --- src/edit.c | 15 ++++++++++----- src/testdir/test_edit.vim | 10 ++++++++++ src/version.c | 2 ++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/edit.c b/src/edit.c index d3fffc51a..22f4bbe1c 100644 --- a/src/edit.c +++ b/src/edit.c @@ -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(void); +static void ins_ctrl_o(int cmdchar); 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,7 +429,8 @@ edit( /* * Main loop in Insert mode: repeat until Insert mode is left. */ - for (;;) + int did_loop = FALSE; + for (;; did_loop = TRUE) { #ifdef FEAT_RIGHTLEFT if (!revins_legal) @@ -588,6 +589,8 @@ edit( if (cmdchar == K_PS) // Got here from normal mode when bracketed paste started. c = K_PS; + else if (cmdchar == 'v' && did_loop) + c = ESC; // in case the stuffed Esc was consumed already else do { @@ -717,7 +720,7 @@ edit( { if (c == Ctrl_O) { - ins_ctrl_o(); + ins_ctrl_o(cmdchar); ins_at_eol = FALSE; // cursor keeps its column nomove = TRUE; } @@ -860,7 +863,7 @@ doESCkey: #endif if (echeck_abbr(Ctrl_O + ABBR_OFF)) break; - ins_ctrl_o(); + ins_ctrl_o(cmdchar); // don't move the cursor left when 'virtualedit' has "onemore". if (get_ve_flags() & VE_ONEMORE) @@ -3848,8 +3851,10 @@ ins_insert(int replaceState) * Pressed CTRL-O in Insert mode. */ static void -ins_ctrl_o(void) +ins_ctrl_o(int cmdchar) { + if (cmdchar == 'v') + return; // abort replacing one char for gr CTRL-O if (State & VREPLACE_FLAG) restart_edit = 'V'; else if (State & REPLACE_FLAG) diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim index 9caa93128..1b00ae98f 100644 --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -2064,6 +2064,16 @@ 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\x" + call assert_equal('bcdef', getline(1)) + + bwipe! +endfunc + " Weird long file name was going over the end of NameBuff func Test_edit_overlong_file_name() CheckUnix diff --git a/src/version.c b/src/version.c index fbc0b9232..23d7a2fe5 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1347, /**/ 1346, /**/ -- 2.40.0