summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-02-23 20:13:04 +0000
committerBram Moolenaar <Bram@vim.org>2023-02-23 20:13:04 +0000
commit2824d1ee325ea61855c26f77e7a4e095b9606720 (patch)
tree9222f05ac6de32b6c72e67ef1c4d40604a7d23c1
parentca06b30073de22dc120b532e90fbee2a10ef9772 (diff)
downloadvim-git-9.0.1347.tar.gz
patch 9.0.1347: "gr CTRL-O" stays in Insert modev9.0.1347
Problem: "gr CTRL-O" stays in Insert mode. (Pierre Ganty) Solution: Do not set restart_edit when "cmdchar" is 'v'. (closes #12045)
-rw-r--r--src/edit.c15
-rw-r--r--src/testdir/test_edit.vim10
-rw-r--r--src/version.c2
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\<C-O>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
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1347,
+/**/
1346,
/**/
1345,