summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-01-24 15:27:50 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-24 15:27:50 +0000
commit502d8ae3e8ed8b6f8dd2ff175f154f9aa87228ef (patch)
tree4f8c375b4f9b90a4d7230ed105224fda7f8f2c48
parentacc4b5648b49ec13c4f35ee0bf552eda71b0c372 (diff)
patch 8.2.4203: entering a character with CTRL-V may include modifiersv8.2.4203
Problem: Entering a character with CTRL-V may include modifiers. Solution: Reset "mod_mask" when entering a character with digits after CTRL-V. (closes #9610)
-rw-r--r--src/edit.c9
-rw-r--r--src/testdir/test_edit.vim21
-rw-r--r--src/version.c2
3 files changed, 28 insertions, 4 deletions
diff --git a/src/edit.c b/src/edit.c
index 0363129303..ee3caf0dad 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -1909,6 +1909,11 @@ get_literal(int noReduceKeys)
if ((nc == ESC || nc == CSI) && !noReduceKeys)
nc = decodeModifyOtherKeys(nc);
+ if ((mod_mask & ~MOD_MASK_SHIFT) != 0)
+ // A character with non-Shift modifiers should not be a valid
+ // character for i_CTRL-V_digit.
+ break;
+
#ifdef FEAT_CMDL_INFO
if (!(State & CMDLINE) && MB_BYTE2LEN_CHECK(nc) == 1)
add_to_showcmd(nc);
@@ -1986,7 +1991,11 @@ get_literal(int noReduceKeys)
--allow_keys;
#endif
if (nc)
+ {
vungetc(nc);
+ // A character typed with i_CTRL-V_digit cannot have modifiers.
+ mod_mask = 0;
+ }
got_int = FALSE; // CTRL-C typed after CTRL-V is not an interrupt
return cc;
}
diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim
index 63226466ee..782e5e0c52 100644
--- a/src/testdir/test_edit.vim
+++ b/src/testdir/test_edit.vim
@@ -1073,14 +1073,16 @@ func Test_edit_DROP()
endfunc
func Test_edit_CTRL_V()
- CheckFeature ebcdic
+ CheckNotFeature ebcdic
+
new
call setline(1, ['abc'])
call cursor(2, 1)
+
" force some redraws
set showmode showcmd
- "call test_override_char_avail(1)
- call test_override('ALL', 1)
+ call test_override('char_avail', 1)
+
call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix')
call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$'))
@@ -1093,8 +1095,19 @@ func Test_edit_CTRL_V()
set norl
endif
- call test_override('ALL', 0)
set noshowmode showcmd
+ call test_override('char_avail', 0)
+
+ " No modifiers should be applied to the char typed using i_CTRL-V_digit.
+ call feedkeys(":append\<CR>\<C-V>76c\<C-V>76\<C-F2>\<C-V>u3c0j\<C-V>u3c0\<M-F3>\<CR>.\<CR>", 'tnix')
+ call assert_equal('LcL<C-F2>πjπ<M-F3>', getline(2))
+
+ if has('osx')
+ " A char with a modifier should not be a valid char for i_CTRL-V_digit.
+ call feedkeys("o\<C-V>\<D-j>\<C-V>\<D-1>\<C-V>\<D-o>\<C-V>\<D-x>\<C-V>\<D-u>", 'tnix')
+ call assert_equal('<D-j><D-1><D-o><D-x><D-u>', getline(3))
+ endif
+
bw!
endfunc
diff --git a/src/version.c b/src/version.c
index 99a7555b61..c75fe99375 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4203,
+/**/
4202,
/**/
4201,