aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-05-07 08:34:37 +0800
committerzeertzjq <zeertzjq@outlook.com>2023-05-08 01:12:09 +0800
commit32331378134599ece34298f866889b4b311d7b79 (patch)
tree62bee36d873793ac3c306baa804df6e31d12cb70
parent29c228dc1087676af5b72f4145ab146cff75156e (diff)
downloadrneovim-32331378134599ece34298f866889b4b311d7b79.tar.gz
rneovim-32331378134599ece34298f866889b4b311d7b79.tar.bz2
rneovim-32331378134599ece34298f866889b4b311d7b79.zip
vim-patch:9.0.1516: cannot use special keys in <Cmd> mapping
Problem: Cannot use special keys in <Cmd> mapping. Solution: Do allow for special keys in <Cmd> and <ScriptCmd> mappings. (closes vim/vim#12326) https://github.com/vim/vim/commit/3ab3a864814f903da8a158c01820e4fbe1013c08
-rw-r--r--src/nvim/getchar.c20
-rw-r--r--src/nvim/ops.c2
-rw-r--r--test/old/testdir/test_mapping.vim27
3 files changed, 34 insertions, 15 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 07d7887fc6..c070e53089 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -554,6 +554,21 @@ void AppendToRedobuffLit(const char *str, int len)
}
}
+/// Append "s" to the redo buffer, leaving 3-byte special key codes unmodified
+/// and escaping other K_SPECIAL bytes.
+void AppendToRedobuffSpec(const char *s)
+{
+ while (*s != NUL) {
+ if ((uint8_t)(*s) == K_SPECIAL && s[1] != NUL && s[2] != NUL) {
+ // Insert special key literally.
+ add_buff(&redobuff, s, 3L);
+ s += 3;
+ } else {
+ add_char_buff(&redobuff, mb_cptr2char_adv(&s));
+ }
+ }
+}
+
/// Append a character to the redo buffer.
/// Translates special keys, NUL, K_SPECIAL and multibyte characters.
void AppendCharToRedobuff(int c)
@@ -2927,11 +2942,6 @@ char *getcmdkeycmd(int promptc, void *cookie, int indent, bool do_concat)
}
c1 = TO_SPECIAL(c1, c2);
}
- if (c1 == Ctrl_V) {
- // CTRL-V is followed by octal, hex or other characters, reverses
- // what AppendToRedobuffLit() does.
- c1 = get_literal(true);
- }
if (got_int) {
aborted = true;
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index bb66bb5731..ef26d5900d 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -5858,7 +5858,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
if (repeat_cmdline == NULL) {
ResetRedobuff();
} else {
- AppendToRedobuffLit(repeat_cmdline, -1);
+ AppendToRedobuffSpec(repeat_cmdline);
AppendToRedobuff(NL_STR);
XFREE_CLEAR(repeat_cmdline);
}
diff --git a/test/old/testdir/test_mapping.vim b/test/old/testdir/test_mapping.vim
index 0cf357694f..8c957d4665 100644
--- a/test/old/testdir/test_mapping.vim
+++ b/test/old/testdir/test_mapping.vim
@@ -979,10 +979,6 @@ func Test_map_cmdkey()
call assert_fails('call feedkeys("\<F3>", "xt")', 'E1136:')
call assert_equal(0, x)
- noremap <F3> <Cmd><F3>let x = 2<CR>
- call assert_fails('call feedkeys("\<F3>", "xt")', 'E1137:')
- call assert_equal(0, x)
-
noremap <F3> <Cmd>let x = 3
call assert_fails('call feedkeys("\<F3>", "xt!")', 'E1255:')
call assert_equal(0, x)
@@ -1084,11 +1080,6 @@ func Test_map_cmdkey()
unmap <F3>
unmap! <F3>
%bw!
-
- " command line ending in "0" is handled without errors
- onoremap ix <cmd>eval 0<cr>
- call feedkeys('dix.', 'xt')
- ounmap ix
endfunc
" text object enters visual mode
@@ -1475,6 +1466,24 @@ func Test_map_cmdkey_redo()
call delete('Xcmdtext')
delfunc SelectDash
ounmap i-
+
+ new
+ call setline(1, 'aaa bbb ccc ddd')
+
+ " command can contain special keys
+ onoremap ix <Cmd>let g:foo ..= '…'<Bar>normal! <C-Right><CR>
+ let g:foo = ''
+ call feedkeys('0dix.', 'xt')
+ call assert_equal('……', g:foo)
+ call assert_equal('ccc ddd', getline(1))
+ unlet g:foo
+
+ " command line ending in "0" is handled without errors
+ onoremap ix <Cmd>eval 0<CR>
+ call feedkeys('dix.', 'xt')
+
+ ounmap ix
+ bwipe!
endfunc
" Test for using <script> with a map to remap characters in rhs