vim-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 vim/vim#12045)

d6a4ea3aa0

Cherry-pick Test_edit_gr_special() from patch 9.0.1347.

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq 2023-02-26 08:32:20 +08:00
parent 48990a7077
commit 5e846978e3
3 changed files with 23 additions and 0 deletions

View File

@ -3444,6 +3444,10 @@ static void ins_ctrl_g(void)
dont_sync_undo = kNone;
break;
case ESC:
// Esc after CTRL-G cancels it.
break;
// Unknown CTRL-G command, reserved for future expansion.
default:
vim_beep(BO_CTRLG);

View File

@ -4720,6 +4720,11 @@ static void 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()) {

View File

@ -2080,6 +2080,20 @@ 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>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
" Weird long file name was going over the end of NameBuff
func Test_edit_overlong_file_name()
CheckUnix