# HG changeset patch # User Bram Moolenaar # Date 1605696305 -3600 # Node ID 1fe53aae3ba0c828e55d13742b1a1b8fd5b115c4 # Parent ccbad7869ee17f0c55e9537c6e75fb94fcc318cc patch 8.2.2005: redoing a mapping with doesn't work properly Commit: https://github.com/vim/vim/commit/c77534c303721df4024fd6cfd51098d593b7d4da Author: Bram Moolenaar Date: Wed Nov 18 11:34:37 2020 +0100 patch 8.2.2005: redoing a mapping with doesn't work properly Problem: Redoing a mapping with doesn't work properly. Solution: Fill the redo buffer. Use "" instead of a key code. (closes #7282) diff --git a/src/getchar.c b/src/getchar.c --- 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 *)""); else { semsg(e_cmd_maping_must_not_include_str_key, diff --git a/src/ops.c b/src/ops.c --- 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; diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim --- 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 i- call SelectDash() + 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 diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 2005, +/**/ 2004, /**/ 2003,