Mercurial > vim
changeset 32317:39320e75f567 v9.0.1490
patch 9.0.1490: the ModeChanged event may be triggered too often
Commit: https://github.com/vim/vim/commit/73916bac5ac2a054a0c71adfe8d742691cdfd95c
Author: zeertzjq <zeertzjq@outlook.com>
Date: Wed Apr 26 16:50:19 2023 +0100
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 26 Apr 2023 18:00:05 +0200 |
parents | 02c07726ccda |
children | 0f5ec76a245f |
files | src/normal.c src/testdir/test_autocmd.vim src/version.c |
diffstat | 3 files changed, 14 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- 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)
--- 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