Patch 9.0.1490
Problem:    The ModeChanged event may be triggered too often.
Solution:   Only trigger ModeChanged when no operator is pending.
            (closes #12298)
Files:      src/normal.c, src/testdir/test_autocmd.vim


*** ../vim-9.0.1489/src/normal.c        2023-04-13 21:47:33.361227019 +0100
--- src/normal.c        2023-04-26 16:47:45.566049337 +0100
***************
*** 975,986 ****
        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();
  #ifdef CURSOR_SHAPE
      // Redraw the cursor with another shape, if we were in Operator-pending
      // mode or did a replace command.
--- 975,989 ----
        reset_reg_var();
  #endif
  
  #ifdef CURSOR_SHAPE
      int prev_finish_op = finish_op;
  #endif
!     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,1001 ****
  #endif
  
      if (oap->op_type == OP_NOP && oap->regname == 0
!           && ca.cmdchar != K_CURSORHOLD)
        clear_showcmd();
  
      checkpcmark();            // check if we moved since setting pcmark
--- 998,1004 ----
  #endif
  
      if (oap->op_type == OP_NOP && oap->regname == 0
!                                                && ca.cmdchar != K_CURSORHOLD)
        clear_showcmd();
  
      checkpcmark();            // check if we moved since setting pcmark
***************
*** 1496,1504 ****
  }
  
  /*
!  * check for operator active and clear it
   *
!  * return TRUE if operator was active
   */
      static int
  checkclearop(oparg_T *oap)
--- 1499,1507 ----
  }
  
  /*
!  * Check for operator active and clear it.
   *
!  * Beep and return TRUE if an operator was active.
   */
      static int
  checkclearop(oparg_T *oap)
***************
*** 1512,1518 ****
  /*
   * Check for operator or Visual active.  Clear active operator.
   *
!  * Return TRUE if operator or Visual was active.
   */
      static int
  checkclearopq(oparg_T *oap)
--- 1515,1521 ----
  /*
   * Check for operator or Visual active.  Clear active operator.
   *
!  * Beep and return TRUE if an operator or Visual was active.
   */
      static int
  checkclearopq(oparg_T *oap)
*** ../vim-9.0.1489/src/testdir/test_autocmd.vim        2023-04-15 
21:27:55.550844924 +0100
--- src/testdir/test_autocmd.vim        2023-04-26 16:47:45.570049335 +0100
***************
*** 3672,3678 ****
  " 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']
    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"))
--- 3672,3678 ----
  " 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', '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,3689 ****
    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')
  
    let g:V_to_v = 0
    au ModeChanged V:v let g:V_to_v += 1
--- 3683,3689 ----
    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>ggdV\<MouseMove>G", 'tnix')
  
    let g:V_to_v = 0
    au ModeChanged V:v let g:V_to_v += 1
*** ../vim-9.0.1489/src/version.c       2023-04-26 15:43:36.606094298 +0100
--- src/version.c       2023-04-26 16:49:13.070005569 +0100
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1490,
  /**/

-- 
LARGE MAN:   Who's that then?
CART DRIVER: (Grudgingly) I dunno, Must be a king.
LARGE MAN:   Why?
CART DRIVER: He hasn't got shit all over him.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230426155046.40E7B1C0414%40moolenaar.net.

Raspunde prin e-mail lui