From aeeadddac43b999a4bc6f57cbbdd2d7c7f1d08e4 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 17 Oct 2025 08:36:27 +0800 Subject: [PATCH] vim-patch:9.1.1858: v:register not reset after Visual mode command (#36215) Problem: v:register not reset after Visual mode command. (laktak) Solution: Reset v:register if Visual mode was active before do_pending_operator() (zeertzjq) fixes: vim/vim#18579 related: vim/vim#5305 closes: vim/vim#18583 https://github.com/vim/vim/commit/b3b47e540d35742503ea372c5a97e8fb5681ab26 --- src/nvim/normal.c | 4 +++- test/old/testdir/test_registers.vim | 12 +++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 1cafc6562a..fd8c6d9406 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -983,6 +983,8 @@ static void normal_finish_command(NormalState *s) s->old_mapped_len = typebuf_maplen(); } + const bool prev_VIsual_active = VIsual_active; + // If an operation is pending, handle it. But not for K_IGNORE or // K_MOUSEMOVE. if (s->ca.cmdchar != K_IGNORE && s->ca.cmdchar != K_MOUSEMOVE) { @@ -1000,7 +1002,7 @@ normal_end: msg_nowait = false; - if (finish_op) { + if (finish_op || prev_VIsual_active) { set_reg_var(get_default_register_name()); } diff --git a/test/old/testdir/test_registers.vim b/test/old/testdir/test_registers.vim index 3ecfa408ff..b5554fec1e 100644 --- a/test/old/testdir/test_registers.vim +++ b/test/old/testdir/test_registers.vim @@ -678,8 +678,13 @@ func Test_v_register() let s:register = '' call feedkeys('"_ddS', 'mx') - call assert_equal('test@', getline('.')) " fails before 8.2.0929 call assert_equal('"', s:register) " fails before 8.2.0929 + call assert_equal('test@', getline('.')) " fails before 8.2.0929 + + let s:register = '' + call feedkeys('V"_dS', 'mx') + call assert_equal('"', s:register) + call assert_equal('test@', getline('.')) let s:register = '' call feedkeys('"zS', 'mx') @@ -698,6 +703,11 @@ func Test_v_register() call assert_equal('"', s:register) " fails before 8.2.0929 call assert_equal('test@', getline('.')) " fails before 8.2.0929 + let s:register = '' + normal V"_dS + call assert_equal('"', s:register) + call assert_equal('test@', getline('.')) + let s:register = '' execute 'normal "z:call' "s:Put()\n" call assert_equal('z', s:register)