diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-04-26 16:50:19 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-04-26 16:50:19 +0100 |
commit | 73916bac5ac2a054a0c71adfe8d742691cdfd95c (patch) | |
tree | e06540d0d94aa32bffa1f2f56bbd71d67d314baa | |
parent | 2f14716c464bbbf1d6cabfb8e270eac0972e98d2 (diff) |
patch 9.0.1490: the ModeChanged event may be triggered too oftenv9.0.1490
Problem: The ModeChanged event may be triggered too often.
Solution: Only trigger ModeChanged when no operator is pending.
(closes #12298)
-rw-r--r-- | src/normal.c | 17 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 4 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 14 insertions, 9 deletions
diff --git a/src/normal.c b/src/normal.c index 1b5326b136..2f3d12a41b 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 176d2823d6..b74dda956d 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\<esc>vVca\<CR>\<C-X>\<C-L>\<esc>ggdG", 'tnix') + call feedkeys("i\<esc>vVca\<CR>\<C-X>\<C-L>\<esc>ggdV\<MouseMove>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 5aa2c12cf5..e5a6ada0c2 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 */ /**/ + 1490, +/**/ 1489, /**/ 1488, |