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;
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.
msg_nowait = FALSE;
#ifdef FEAT_EVAL
- if (finish_op || prev_VIsual_active)
+ if (finish_op || did_visual_op)
reset_reg_var();
#endif
exec 'normal! "' .. v:register .. 'P'
endfunc
nnoremap <buffer> <plug>(test) :<c-u>call s:Put()<cr>
+ xnoremap <buffer> <plug>(test) :<c-u>call s:Put()<cr>
nmap <buffer> S <plug>(test)
+ xmap <buffer> S <plug>(test)
let @z = "testz\n"
let @" = "test@\n"
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\<Ignore>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\<Ignore>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