Skip to content

Commit 0124320

Browse files
zeertzjqchrisbra
authored andcommitted
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: #18583 (comment) closes: #18597 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
1 parent 5932ed3 commit 0124320

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

src/normal.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,9 @@ normal_cmd(
695695
int idx;
696696
int set_prevcount = FALSE;
697697
int save_did_cursorhold = did_cursorhold;
698+
#ifdef FEAT_EVAL
699+
int did_visual_op = FALSE;
700+
#endif
698701

699702
CLEAR_FIELD(ca); // also resets ca.retval
700703
ca.oap = oap;
@@ -968,14 +971,18 @@ normal_cmd(
968971
if (old_mapped_len > 0)
969972
old_mapped_len = typebuf_maplen();
970973

971-
#ifdef FEAT_EVAL
972-
int prev_VIsual_active = VIsual_active;
973-
#endif
974-
975974
// If an operation is pending, handle it. But not for K_IGNORE or
976975
// K_MOUSEMOVE.
977976
if (ca.cmdchar != K_IGNORE && ca.cmdchar != K_MOUSEMOVE)
977+
{
978+
#ifdef FEAT_EVAL
979+
did_visual_op = VIsual_active && oap->op_type != OP_NOP
980+
// For OP_COLON, do_pending_operator() stuffs ':' into
981+
// the read buffer, which isn't executed immediately.
982+
&& oap->op_type != OP_COLON;
983+
#endif
978984
do_pending_operator(&ca, old_col, FALSE);
985+
}
979986

980987
// Wait for a moment when a message is displayed that will be overwritten
981988
// by the mode message.
@@ -988,7 +995,7 @@ normal_cmd(
988995
msg_nowait = FALSE;
989996

990997
#ifdef FEAT_EVAL
991-
if (finish_op || prev_VIsual_active)
998+
if (finish_op || did_visual_op)
992999
reset_reg_var();
9931000
#endif
9941001

src/testdir/test_registers.vim

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,9 @@ func Test_v_register()
692692
exec 'normal! "' .. v:register .. 'P'
693693
endfunc
694694
nnoremap <buffer> <plug>(test) :<c-u>call s:Put()<cr>
695+
xnoremap <buffer> <plug>(test) :<c-u>call s:Put()<cr>
695696
nmap <buffer> S <plug>(test)
697+
xmap <buffer> S <plug>(test)
696698
697699
let @z = "testz\n"
698700
let @" = "test@\n"
@@ -710,15 +712,41 @@ func Test_v_register()
710712
let s:register = ''
711713
call feedkeys('"zS', 'mx')
712714
call assert_equal('z', s:register)
715+
call assert_equal('testz', getline('.'))
713716

714717
let s:register = ''
715718
call feedkeys('"zSS', 'mx')
716719
call assert_equal('"', s:register)
720+
call assert_equal('test@', getline('.'))
721+
722+
let s:register = ''
723+
call feedkeys("\"z\<Ignore>S", 'mx')
724+
call assert_equal('z', s:register)
725+
call assert_equal('testz', getline('.'))
717726

718727
let s:register = ''
719728
call feedkeys('"_S', 'mx')
720729
call assert_equal('_', s:register)
721730

731+
let s:register = ''
732+
call feedkeys('V"zS', 'mx')
733+
call assert_equal('z', s:register)
734+
call assert_equal('testz', getline('.'))
735+
736+
let s:register = ''
737+
call feedkeys('V"zSS', 'mx')
738+
call assert_equal('"', s:register)
739+
call assert_equal('test@', getline('.'))
740+
741+
let s:register = ''
742+
call feedkeys("V\"z\<Ignore>S", 'mx')
743+
call assert_equal('z', s:register)
744+
call assert_equal('testz', getline('.'))
745+
746+
let s:register = ''
747+
call feedkeys('V"_S', 'mx')
748+
call assert_equal('_', s:register)
749+
722750
let s:register = ''
723751
normal "_ddS
724752
call assert_equal('"', s:register) " fails before 8.2.0929

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,8 @@ static char *(features[]) =
734734

735735
static int included_patches[] =
736736
{ /* Add new patch number below this line */
737+
/**/
738+
1868,
737739
/**/
738740
1867,
739741
/**/

0 commit comments

Comments
 (0)