From 0124320c97b0fbbb44613f42fc1c34fee6181fc8 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 18 Oct 2025 14:37:48 +0000 Subject: [PATCH] patch 9.1.1868: v:register is wrong in v_: command Problem: v:register is wrong in v_: command (after 9.1.1858). Solution: Don't reset v:register for OP_COLON (zeertzjq) related: https://github.com/vim/vim/pull/18583#issuecomment-3418030021 closes: #18597 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/normal.c | 17 ++++++++++++----- src/testdir/test_registers.vim | 28 ++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/normal.c b/src/normal.c index ead265dc26..63edaa964c 100644 --- a/src/normal.c +++ b/src/normal.c @@ -695,6 +695,9 @@ normal_cmd( int idx; int set_prevcount = FALSE; int save_did_cursorhold = did_cursorhold; +#ifdef FEAT_EVAL + int did_visual_op = FALSE; +#endif CLEAR_FIELD(ca); // also resets ca.retval ca.oap = oap; @@ -968,14 +971,18 @@ normal_cmd( if (old_mapped_len > 0) old_mapped_len = typebuf_maplen(); -#ifdef FEAT_EVAL - int prev_VIsual_active = VIsual_active; -#endif - // If an operation is pending, handle it. But not for K_IGNORE or // K_MOUSEMOVE. if (ca.cmdchar != K_IGNORE && ca.cmdchar != K_MOUSEMOVE) + { +#ifdef FEAT_EVAL + did_visual_op = VIsual_active && oap->op_type != OP_NOP + // For OP_COLON, do_pending_operator() stuffs ':' into + // the read buffer, which isn't executed immediately. + && oap->op_type != OP_COLON; +#endif do_pending_operator(&ca, old_col, FALSE); + } // Wait for a moment when a message is displayed that will be overwritten // by the mode message. @@ -988,7 +995,7 @@ normal_end: msg_nowait = FALSE; #ifdef FEAT_EVAL - if (finish_op || prev_VIsual_active) + if (finish_op || did_visual_op) reset_reg_var(); #endif diff --git a/src/testdir/test_registers.vim b/src/testdir/test_registers.vim index 4d04ff7cdc..2720937cf5 100644 --- a/src/testdir/test_registers.vim +++ b/src/testdir/test_registers.vim @@ -692,7 +692,9 @@ func Test_v_register() exec 'normal! "' .. v:register .. 'P' endfunc nnoremap (test) :call s:Put() + xnoremap (test) :call s:Put() nmap S (test) + xmap S (test) let @z = "testz\n" let @" = "test@\n" @@ -710,15 +712,41 @@ func Test_v_register() let s:register = '' call feedkeys('"zS', 'mx') call assert_equal('z', s:register) + call assert_equal('testz', getline('.')) let s:register = '' call feedkeys('"zSS', 'mx') call assert_equal('"', s:register) + call assert_equal('test@', getline('.')) + + let s:register = '' + call feedkeys("\"z\S", 'mx') + call assert_equal('z', s:register) + call assert_equal('testz', getline('.')) let s:register = '' call feedkeys('"_S', 'mx') call assert_equal('_', s:register) + let s:register = '' + call feedkeys('V"zS', 'mx') + call assert_equal('z', s:register) + call assert_equal('testz', getline('.')) + + let s:register = '' + call feedkeys('V"zSS', 'mx') + call assert_equal('"', s:register) + call assert_equal('test@', getline('.')) + + let s:register = '' + call feedkeys("V\"z\S", 'mx') + call assert_equal('z', s:register) + call assert_equal('testz', getline('.')) + + let s:register = '' + call feedkeys('V"_S', 'mx') + call assert_equal('_', s:register) + let s:register = '' normal "_ddS call assert_equal('"', s:register) " fails before 8.2.0929 diff --git a/src/version.c b/src/version.c index 5f43d92b09..0d6a5fd124 100644 --- a/src/version.c +++ b/src/version.c @@ -734,6 +734,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1868, /**/ 1867, /**/