From 2824d1ee325ea61855c26f77e7a4e095b9606720 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 23 Feb 2023 20:13:04 +0000 Subject: 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 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'src/edit.c') diff --git a/src/edit.c b/src/edit.c index d3fffc51a7..22f4bbe1ca 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) -- cgit v1.2.3