]> granicus.if.org Git - vim/commitdiff
patch 8.2.0929: v:register is not cleared after an operator was executed v8.2.0929
authorBram Moolenaar <Bram@vim.org>
Sun, 7 Jun 2020 19:31:18 +0000 (21:31 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 7 Jun 2020 19:31:18 +0000 (21:31 +0200)
Problem:    v:register is not cleared after an operator was executed.
Solution:   Clear v:register after finishing an operator (Andy Massimino,
            closes #5305)

src/normal.c
src/testdir/test_registers.vim
src/version.c

index e3523546b91826685521147d841cc8df4094d8cf..ae2c1f5e324edaaea788917463cc8c338deed764 100644 (file)
@@ -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;
index b803b3aff152902f7c8aaace33279ffb8c57a7b8..22fac08455d74b175952e1a3f9bcb6210d5b1059 100644 (file)
@@ -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
index 3eb845c36e30abddab1b5eeb4b8a0a1b602594df..3015f8fd16b5ab0fa66ba00495cd343eeaafcb3e 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    929,
 /**/
     928,
 /**/