Mercurial > vim
changeset 22916:1fe53aae3ba0 v8.2.2005
patch 8.2.2005: redoing a mapping with <Cmd> doesn't work properly
Commit: https://github.com/vim/vim/commit/c77534c303721df4024fd6cfd51098d593b7d4da
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Nov 18 11:34:37 2020 +0100
patch 8.2.2005: redoing a mapping with <Cmd> doesn't work properly
Problem: Redoing a mapping with <Cmd> doesn't work properly.
Solution: Fill the redo buffer. Use "<SNR>" instead of a key code.
(closes #7282)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 18 Nov 2020 11:45:05 +0100 |
parents | ccbad7869ee1 |
children | 0a8359e95ec9 |
files | src/getchar.c src/ops.c src/testdir/test_mapping.vim src/version.c |
diffstat | 4 files changed, 43 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/getchar.c +++ b/src/getchar.c @@ -3691,11 +3691,7 @@ getcmdkeycmd( else if (IS_SPECIAL(c1)) { if (c1 == K_SNR) - { - ga_append(&line_ga, (char)K_SPECIAL); - ga_append(&line_ga, (char)KS_EXTRA); - ga_append(&line_ga, (char)KE_SNR); - } + ga_concat(&line_ga, (char_u *)"<SNR>"); else { semsg(e_cmd_maping_must_not_include_str_key,
--- a/src/ops.c +++ b/src/ops.c @@ -3465,8 +3465,9 @@ do_pending_operator(cmdarg_T *cap, int o if ((redo_yank || oap->op_type != OP_YANK) && ((!VIsual_active || oap->motion_force) // Also redo Operator-pending Visual mode mappings - || (VIsual_active && cap->cmdchar == ':' - && oap->op_type != OP_COLON)) + || (VIsual_active + && (cap->cmdchar == ':' || cap->cmdchar == K_COMMAND) + && oap->op_type != OP_COLON)) && cap->cmdchar != 'D' #ifdef FEAT_FOLDING && oap->op_type != OP_FOLD @@ -3688,7 +3689,7 @@ do_pending_operator(cmdarg_T *cap, int o get_op_char(oap->op_type), get_extra_op_char(oap->op_type), oap->motion_force, cap->cmdchar, cap->nchar); - else if (cap->cmdchar != ':') + else if (cap->cmdchar != ':' && cap->cmdchar != K_COMMAND) { int nchar = oap->op_type == OP_REPLACE ? cap->nchar : NUL;
--- a/src/testdir/test_mapping.vim +++ b/src/testdir/test_mapping.vim @@ -1324,4 +1324,40 @@ func Test_map_cmdkey_cmdline_mode() %bw! endfunc +func Test_map_cmdkey_redo() + func SelectDash() + call search('^---\n\zs', 'bcW') + norm! V + call search('\n\ze---$', 'W') + endfunc + + let text =<< trim END + --- + aaa + --- + bbb + bbb + --- + ccc + ccc + ccc + --- + END + new Xcmdtext + call setline(1, text) + + onoremap <silent> i- <Cmd>call SelectDash()<CR> + call feedkeys('2Gdi-', 'xt') + call assert_equal(['---', '---'], getline(1, 2)) + call feedkeys('j.', 'xt') + call assert_equal(['---', '---', '---'], getline(1, 3)) + call feedkeys('j.', 'xt') + call assert_equal(['---', '---', '---', '---'], getline(1, 4)) + + bwipe! + call delete('Xcmdtext') + delfunc SelectDash + ounmap i- +endfunc + " vim: shiftwidth=2 sts=2 expandtab