diff options
author | Bram Moolenaar <Bram@vim.org> | 2023-02-25 14:24:44 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-02-25 14:24:44 +0000 |
commit | d6a4ea3aa0d3f4a886ea900e94bf4e8ca8ae8d63 (patch) | |
tree | 08280d9941371f9a9138a61082cb65361931ef04 | |
parent | 6d611de58c8e324491415da8e79c6bd3faa3e848 (diff) | |
download | vim-git-d6a4ea3aa0d3f4a886ea900e94bf4e8ca8ae8d63.tar.gz |
patch 9.0.1354: "gr CTRL-G" stays in virtual replace modev9.0.1354
Problem: "gr CTRL-G" stays in virtual replace mode. (Pierre Ganty)
Solution: Prepend CTRL-V before control characters. (closes #12045)
-rw-r--r-- | src/edit.c | 4 | ||||
-rw-r--r-- | src/normal.c | 4 | ||||
-rw-r--r-- | src/testdir/test_edit.vim | 8 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 16 insertions, 2 deletions
diff --git a/src/edit.c b/src/edit.c index a030e537a..ff9fc0ed0 100644 --- a/src/edit.c +++ b/src/edit.c @@ -3527,6 +3527,10 @@ ins_ctrl_g(void) dont_sync_undo = MAYBE; break; + case ESC: + // Esc after CTRL-G cancels it. + break; + // Unknown CTRL-G command, reserved for future expansion. default: vim_beep(BO_CTRLG); } diff --git a/src/normal.c b/src/normal.c index b3ea5e8bc..95bb1a97d 100644 --- a/src/normal.c +++ b/src/normal.c @@ -5033,6 +5033,10 @@ 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()) diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim index 1b00ae98f..f0896d2c5 100644 --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -2068,8 +2068,12 @@ endfunc func Test_edit_gr_special() enew call setline(1, ['abcdef', 'xxxxxx']) - exe "normal! gr\<C-O>x" - call assert_equal('bcdef', getline(1)) + 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 diff --git a/src/version.c b/src/version.c index c3631e6cc..315f91eac 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 */ /**/ + 1354, +/**/ 1353, /**/ 1352, |