From 73916bac5ac2a054a0c71adfe8d742691cdfd95c Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 26 Apr 2023 16:50:19 +0100 Subject: patch 9.0.1490: the ModeChanged event may be triggered too often Problem: The ModeChanged event may be triggered too often. Solution: Only trigger ModeChanged when no operator is pending. (closes #12298) --- src/normal.c | 17 ++++++++++------- src/testdir/test_autocmd.vim | 4 ++-- src/version.c | 2 ++ 3 files changed, 14 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/normal.c b/src/normal.c index 1b5326b13..2f3d12a41 100644 --- a/src/normal.c +++ b/src/normal.c @@ -975,12 +975,15 @@ normal_end: reset_reg_var(); #endif - // Reset finish_op, in case it was set #ifdef CURSOR_SHAPE int prev_finish_op = finish_op; #endif - finish_op = FALSE; - may_trigger_modechanged(); + if (oap->op_type == OP_NOP) + { + // Reset finish_op, in case it was set + finish_op = FALSE; + may_trigger_modechanged(); + } #ifdef CURSOR_SHAPE // Redraw the cursor with another shape, if we were in Operator-pending // mode or did a replace command. @@ -995,7 +998,7 @@ normal_end: #endif if (oap->op_type == OP_NOP && oap->regname == 0 - && ca.cmdchar != K_CURSORHOLD) + && ca.cmdchar != K_CURSORHOLD) clear_showcmd(); checkpcmark(); // check if we moved since setting pcmark @@ -1496,9 +1499,9 @@ prep_redo_num2( } /* - * check for operator active and clear it + * Check for operator active and clear it. * - * return TRUE if operator was active + * Beep and return TRUE if an operator was active. */ static int checkclearop(oparg_T *oap) @@ -1512,7 +1515,7 @@ checkclearop(oparg_T *oap) /* * Check for operator or Visual active. Clear active operator. * - * Return TRUE if operator or Visual was active. + * Beep and return TRUE if an operator or Visual was active. */ static int checkclearopq(oparg_T *oap) diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 176d2823d..b74dda956 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -3672,7 +3672,7 @@ endfunc " Test for ModeChanged pattern func Test_mode_changes() let g:index = 0 - let g:mode_seq = ['n', 'i', 'n', 'v', 'V', 'i', 'ix', 'i', 'ic', 'i', 'n', 'no', 'n', 'V', 'v', 's', 'n'] + let g:mode_seq = ['n', 'i', 'n', 'v', 'V', 'i', 'ix', 'i', 'ic', 'i', 'n', 'no', 'noV', 'n', 'V', 'v', 's', 'n'] func! TestMode() call assert_equal(g:mode_seq[g:index], get(v:event, "old_mode")) call assert_equal(g:mode_seq[g:index + 1], get(v:event, "new_mode")) @@ -3683,7 +3683,7 @@ func Test_mode_changes() au ModeChanged * :call TestMode() let g:n_to_any = 0 au ModeChanged n:* let g:n_to_any += 1 - call feedkeys("i\vVca\\\\ggdG", 'tnix') + call feedkeys("i\vVca\\\\ggdV\G", 'tnix') let g:V_to_v = 0 au ModeChanged V:v let g:V_to_v += 1 diff --git a/src/version.c b/src/version.c index 5aa2c12cf..e5a6ada0c 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1490, /**/ 1489, /**/ -- cgit v1.2.1