# HG changeset patch # User Bram Moolenaar # Date 1677423605 -3600 # Node ID 717a1a8dc7511cb783884a667fe0dfc5b4a76f76 # Parent 0c1c18056343e09cf79e740080086449402c0375 patch 9.0.1356: cannot cancel "gr" with Esc Commit: https://github.com/vim/vim/commit/4f026ea9f1ad9db262f0dba522768c84e5ae37b4 Author: zeertzjq Date: Sun Feb 26 14:47:24 2023 +0000 patch 9.0.1356: cannot cancel "gr" with Esc Problem: Cannot cancel "gr" with Esc. Solution: Make "gr" do nothing. (closes https://github.com/vim/vim/issues/12064) diff --git a/src/edit.c b/src/edit.c --- 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(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) diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -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) diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -573,6 +573,7 @@ func Test_edit_CTRL_G() call assert_equal([0, 3, 7, 0], getpos('.')) call feedkeys("i\j\", 'tnix') call assert_equal([0, 3, 6, 0], getpos('.')) + call assert_nobeep("normal! i\\") 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\lx" - call assert_equal("\def", getline(1)) - - call setline(1, 'abcdef') - exe "normal! 0gr\lx" - call assert_equal("\def", 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/testdir/test_normal.vim b/src/testdir/test_normal.vim --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -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\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\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\") set modifiable& - enew! + + call assert_nobeep("normal! gr\") + call assert_beeps("normal! cgr\") + + call assert_equal('zxxxx line l', getline(1)) + exe "normal! 2|gr\\" + call assert_equal("z\xx line l", getline(1)) + + call setline(1, 'abcdef') + exe "normal! 0gr\lx" + call assert_equal("\def", getline(1)) + + call setline(1, 'abcdef') + exe "normal! 0gr\lx" + call assert_equal("\def", getline(1)) + + bwipe! endfunc func Test_nv_hat_count() diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1356, +/**/ 1355, /**/ 1354,