summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-07 21:31:18 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-07 21:31:18 +0200
commitcc613031b96f1cfa5a184253e745c26f1def9be4 (patch)
treefe85bf19e82ccfdc37c8c1f6d2ac802ede95efa3
parentacc224064033e5cea21ef7f1eefb356ca06ff11d (diff)
patch 8.2.0929: v:register is not cleared after an operator was executedv8.2.0929
Problem: v:register is not cleared after an operator was executed. Solution: Clear v:register after finishing an operator (Andy Massimino, closes #5305)
-rw-r--r--src/normal.c5
-rw-r--r--src/testdir/test_registers.vim69
-rw-r--r--src/version.c2
3 files changed, 76 insertions, 0 deletions
diff --git a/src/normal.c b/src/normal.c
index e3523546b9..ae2c1f5e32 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -1181,6 +1181,11 @@ normal_end:
msg_nowait = FALSE;
+#ifdef FEAT_EVAL
+ if (finish_op)
+ reset_reg_var();
+#endif
+
// Reset finish_op, in case it was set
#ifdef CURSOR_SHAPE
c = finish_op;
diff --git a/src/testdir/test_registers.vim b/src/testdir/test_registers.vim
index b803b3aff1..22fac08455 100644
--- a/src/testdir/test_registers.vim
+++ b/src/testdir/test_registers.vim
@@ -488,4 +488,73 @@ func Test_set_register_dict()
bwipe!
endfunc
+func Test_v_register()
+ enew
+ call setline(1, 'nothing')
+
+ func s:Put()
+ let s:register = v:register
+ exec 'normal! "' .. v:register .. 'P'
+ endfunc
+ nnoremap <buffer> <plug>(test) :<c-u>call s:Put()<cr>
+ nmap <buffer> S <plug>(test)
+
+ let @z = "testz\n"
+ let @" = "test@\n"
+
+ 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
+
+ let s:register = ''
+ call feedkeys('"zS', 'mx')
+ call assert_equal('z', s:register)
+
+ let s:register = ''
+ call feedkeys('"zSS', 'mx')
+ call assert_equal('"', s:register)
+
+ let s:register = ''
+ call feedkeys('"_S', 'mx')
+ call assert_equal('_', s:register)
+
+ let s:register = ''
+ normal "_ddS
+ call assert_equal('"', s:register) " fails before 8.2.0929
+ call assert_equal('test@', getline('.')) " fails before 8.2.0929
+
+ let s:register = ''
+ execute 'normal "z:call' "s:Put()\n"
+ call assert_equal('z', s:register)
+ call assert_equal('testz', getline('.'))
+
+ " Test operator and omap
+ let @b = 'testb'
+ func s:OpFunc(...)
+ let s:register2 = v:register
+ endfunc
+ set opfunc=s:OpFunc
+
+ normal "bg@l
+ normal S
+ call assert_equal('"', s:register) " fails before 8.2.0929
+ call assert_equal('b', s:register2)
+
+ func s:Motion()
+ let s:register1 = v:register
+ normal! l
+ endfunc
+ onoremap <buffer> Q :<c-u>call s:Motion()<cr>
+
+ normal "bg@Q
+ normal S
+ call assert_equal('"', s:register)
+ call assert_equal('b', s:register1)
+ call assert_equal('"', s:register2)
+
+ set opfunc&
+ bwipe!
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 3eb845c36e..3015f8fd16 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 929,
+/**/
928,
/**/
927,