summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-11-15 13:46:12 +0000
committerBram Moolenaar <Bram@vim.org>2022-11-15 13:46:12 +0000
commitcdeb65729d96c90320b9009e583ade305c396f29 (patch)
treed5450fb16230c8aa8ec29f392d303deaa8eb397e
parent698a00f55d60043d51b1c98cbbf3f9fd10badd2f (diff)
patch 9.0.0884: mouse shape remains in op-pending mode after failed changev9.0.0884
Problem: Mouse shape remains in op-pending mode after failed change. Solution: Reset finish_op and restore it. (closes #11545)
-rw-r--r--src/ops.c12
-rw-r--r--src/testdir/test_normal.vim33
-rw-r--r--src/version.c2
3 files changed, 43 insertions, 4 deletions
diff --git a/src/ops.c b/src/ops.c
index ed8a5d81d9..6e51822889 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -1775,8 +1775,14 @@ op_change(oparg_T *oap)
if (oap->motion_type == MLINE)
fix_indent();
+ // Reset finish_op now, don't want it set inside edit().
+ int save_finish_op = finish_op;
+ finish_op = FALSE;
+
retval = edit(NUL, FALSE, (linenr_T)1);
+ finish_op = save_finish_op;
+
/*
* In Visual block mode, handle copying the new text to all lines of the
* block.
@@ -3438,8 +3444,6 @@ op_function(oparg_T *oap UNUSED)
{
#ifdef FEAT_EVAL
typval_T argv[2];
- int save_virtual_op = virtual_op;
- int save_finish_op = finish_op;
pos_T orig_start = curbuf->b_op_start;
pos_T orig_end = curbuf->b_op_end;
typval_T rettv;
@@ -3466,9 +3470,11 @@ op_function(oparg_T *oap UNUSED)
// Reset virtual_op so that 'virtualedit' can be changed in the
// function.
+ int save_virtual_op = virtual_op;
virtual_op = MAYBE;
// Reset finish_op so that mode() returns the right value.
+ int save_finish_op = finish_op;
finish_op = FALSE;
if (call_callback(&opfunc_cb, 0, &rettv, 1, argv) != FAIL)
@@ -4113,8 +4119,6 @@ do_pending_operator(cmdarg_T *cap, int old_col, int gui_yank)
// before.
restore_lbr(lbr_saved);
#endif
- // Reset finish_op now, don't want it set inside edit().
- finish_op = FALSE;
if (op_change(oap)) // will call edit()
cap->retval |= CA_COMMAND_BUSY;
if (restart_edit == 0)
diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim
index 909492718b..f7194b6035 100644
--- a/src/testdir/test_normal.vim
+++ b/src/testdir/test_normal.vim
@@ -3807,4 +3807,37 @@ func Test_normal_count_out_of_range()
bwipe!
endfunc
+" Test that mouse shape is restored to Normal mode after failed "c" operation.
+func Test_mouse_shape_after_failed_change()
+ CheckFeature mouseshape
+ CheckCanRunGui
+
+ let lines =<< trim END
+ set mouseshape+=o:busy
+ setlocal nomodifiable
+ let g:mouse_shapes = []
+
+ func SaveMouseShape(timer)
+ let g:mouse_shapes += [getmouseshape()]
+ endfunc
+
+ func SaveAndQuit(timer)
+ call writefile(g:mouse_shapes, 'Xmouseshapes')
+ quit
+ endfunc
+
+ call timer_start(50, {_ -> feedkeys('c')})
+ call timer_start(100, 'SaveMouseShape')
+ call timer_start(150, {_ -> feedkeys('c')})
+ call timer_start(200, 'SaveMouseShape')
+ call timer_start(250, 'SaveAndQuit')
+ END
+ call writefile(lines, 'Xmouseshape.vim', 'D')
+ call RunVim([], [], "-g -S Xmouseshape.vim")
+ sleep 300m
+ call assert_equal(['busy', 'arrow'], readfile('Xmouseshapes'))
+
+ call delete('Xmouseshapes')
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 7fae79d38b..3ca13a89b0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 884,
+/**/
883,
/**/
882,