Patch 8.1.0256 (after 8.1.0245)
Problem:    Using setline() in TextChangedI splits undo.
Solution:   Use another solution for undo not working properly.
Files:      src/edit.c, src/testdir/test_autocmd.vim


*** ../vim-8.1.0255/src/edit.c  2018-08-07 19:32:48.371651690 +0200
--- src/edit.c  2018-08-08 22:07:51.235091964 +0200
***************
*** 279,284 ****
--- 279,285 ----
  #if defined(FEAT_EVAL)
  static char_u *do_insert_char_pre(int c);
  #endif
+ static int ins_apply_autocmds(event_T event);
  
  static colnr_T        Insstart_textlen;       /* length of line when insert 
started */
  static colnr_T        Insstart_blank_vcol;    /* vcol for first inserted 
blank */
***************
*** 411,417 ****
        set_vim_var_string(VV_INSERTMODE, ptr, 1);
        set_vim_var_string(VV_CHAR, NULL, -1);  /* clear v:char */
  #endif
!       apply_autocmds(EVENT_INSERTENTER, NULL, NULL, FALSE, curbuf);
  
        /* Make sure the cursor didn't move.  Do call check_cursor_col() in
         * case the text was modified.  Since Insert mode was not started yet
--- 412,418 ----
        set_vim_var_string(VV_INSERTMODE, ptr, 1);
        set_vim_var_string(VV_CHAR, NULL, -1);  /* clear v:char */
  #endif
!       ins_apply_autocmds(EVENT_INSERTENTER);
  
        /* Make sure the cursor didn't move.  Do call check_cursor_col() in
         * case the text was modified.  Since Insert mode was not started yet
***************
*** 1061,1068 ****
            if (ins_esc(&count, cmdchar, nomove))
            {
                if (cmdchar != 'r' && cmdchar != 'v')
!                   apply_autocmds(EVENT_INSERTLEAVE, NULL, NULL,
!                                                              FALSE, curbuf);
                did_cursorhold = FALSE;
                return (c == Ctrl_O);
            }
--- 1062,1068 ----
            if (ins_esc(&count, cmdchar, nomove))
            {
                if (cmdchar != 'r' && cmdchar != 'v')
!                   ins_apply_autocmds(EVENT_INSERTLEAVE);
                did_cursorhold = FALSE;
                return (c == Ctrl_O);
            }
***************
*** 1275,1281 ****
            break;
  
        case K_CURSORHOLD:      /* Didn't type something for a while. */
!           apply_autocmds(EVENT_CURSORHOLDI, NULL, NULL, FALSE, curbuf);
            did_cursorhold = TRUE;
            break;
  
--- 1275,1281 ----
            break;
  
        case K_CURSORHOLD:      /* Didn't type something for a while. */
!           ins_apply_autocmds(EVENT_CURSORHOLDI);
            did_cursorhold = TRUE;
            break;
  
***************
*** 1698,1704 ****
            /* Make sure curswant is correct, an autocommand may call
             * getcurpos(). */
            update_curswant();
!           apply_autocmds(EVENT_CURSORMOVEDI, NULL, NULL, FALSE, curbuf);
        }
  # ifdef FEAT_CONCEAL
        if (curwin->w_p_cole > 0)
--- 1698,1704 ----
            /* Make sure curswant is correct, an autocommand may call
             * getcurpos(). */
            update_curswant();
!           ins_apply_autocmds(EVENT_CURSORMOVEDI);
        }
  # ifdef FEAT_CONCEAL
        if (curwin->w_p_cole > 0)
***************
*** 1721,1744 ****
            )
      {
        aco_save_T      aco;
! 
! #ifdef FEAT_EVAL
!       // Sync undo when the autocommand calls setline() or append(), so that
!       // it can be undone separately.
!       u_sync_once = 2;
! #endif
  
        // save and restore curwin and curbuf, in case the autocmd changes them
        aucmd_prepbuf(&aco, curbuf);
        apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
        aucmd_restbuf(&aco);
        curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
! 
! #ifdef FEAT_EVAL
!       if (u_sync_once == 1)
!           ins_need_undo = TRUE;
!       u_sync_once = 0;
! #endif
      }
  
  #ifdef FEAT_INS_EXPAND
--- 1721,1736 ----
            )
      {
        aco_save_T      aco;
!       varnumber_T     tick = CHANGEDTICK(curbuf);
  
        // save and restore curwin and curbuf, in case the autocmd changes them
        aucmd_prepbuf(&aco, curbuf);
        apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
        aucmd_restbuf(&aco);
        curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
!       if (tick != CHANGEDTICK(curbuf))  // see ins_apply_autocmds()
!           u_save(curwin->w_cursor.lnum,
!                                       (linenr_T)(curwin->w_cursor.lnum + 1));
      }
  
  #ifdef FEAT_INS_EXPAND
***************
*** 1750,1761 ****
--- 1742,1757 ----
            && pum_visible())
      {
        aco_save_T      aco;
+       varnumber_T     tick = CHANGEDTICK(curbuf);
  
        // save and restore curwin and curbuf, in case the autocmd changes them
        aucmd_prepbuf(&aco, curbuf);
        apply_autocmds(EVENT_TEXTCHANGEDP, NULL, NULL, FALSE, curbuf);
        aucmd_restbuf(&aco);
        curbuf->b_last_changedtick_pum = CHANGEDTICK(curbuf);
+       if (tick != CHANGEDTICK(curbuf))  // see ins_apply_autocmds()
+           u_save(curwin->w_cursor.lnum,
+                                       (linenr_T)(curwin->w_cursor.lnum + 1));
      }
  #endif
  
***************
*** 4124,4136 ****
  #endif
            /* Trigger the CompleteDone event to give scripts a chance to act
             * upon the completion. */
!           apply_autocmds(EVENT_COMPLETEDONE, NULL, NULL, FALSE, curbuf);
        }
      }
      else if (ctrl_x_mode == CTRL_X_LOCAL_MSG)
        /* Trigger the CompleteDone event to give scripts a chance to act
         * upon the (possibly failed) completion. */
!       apply_autocmds(EVENT_COMPLETEDONE, NULL, NULL, FALSE, curbuf);
  
      /* reset continue_* if we left expansion-mode, if we stay they'll be
       * (re)set properly in ins_complete() */
--- 4120,4132 ----
  #endif
            /* Trigger the CompleteDone event to give scripts a chance to act
             * upon the completion. */
!           ins_apply_autocmds(EVENT_COMPLETEDONE);
        }
      }
      else if (ctrl_x_mode == CTRL_X_LOCAL_MSG)
        /* Trigger the CompleteDone event to give scripts a chance to act
         * upon the (possibly failed) completion. */
!       ins_apply_autocmds(EVENT_COMPLETEDONE);
  
      /* reset continue_* if we left expansion-mode, if we stay they'll be
       * (re)set properly in ins_complete() */
***************
*** 8944,8950 ****
                          : replaceState == VREPLACE ? "v"
                                                     : "r"), 1);
  # endif
!     apply_autocmds(EVENT_INSERTCHANGE, NULL, NULL, FALSE, curbuf);
      if (State & REPLACE_FLAG)
        State = INSERT | (State & LANGMAP);
      else
--- 8940,8946 ----
                          : replaceState == VREPLACE ? "v"
                                                     : "r"), 1);
  # endif
!     ins_apply_autocmds(EVENT_INSERTCHANGE);
      if (State & REPLACE_FLAG)
        State = INSERT | (State & LANGMAP);
      else
***************
*** 10738,10744 ****
      set_vim_var_string(VV_CHAR, buf, -1);  /* set v:char */
  
      res = NULL;
!     if (apply_autocmds(EVENT_INSERTCHARPRE, NULL, NULL, FALSE, curbuf))
      {
        /* Get the value of v:char.  It may be empty or more than one
         * character.  Only use it when changed, otherwise continue with the
--- 10734,10740 ----
      set_vim_var_string(VV_CHAR, buf, -1);  /* set v:char */
  
      res = NULL;
!     if (ins_apply_autocmds(EVENT_INSERTCHARPRE))
      {
        /* Get the value of v:char.  It may be empty or more than one
         * character.  Only use it when changed, otherwise continue with the
***************
*** 10753,10755 ****
--- 10749,10770 ----
      return res;
  }
  #endif
+ 
+ /*
+  * Trigger "event" and take care of fixing undo.
+  */
+     static int
+ ins_apply_autocmds(event_T event)
+ {
+     varnumber_T       tick = CHANGEDTICK(curbuf);
+     int r;
+ 
+     r = apply_autocmds(event, NULL, NULL, FALSE, curbuf);
+ 
+     // If u_savesub() was called then we are not prepared to start
+     // a new line.  Call u_save() with no contents to fix that.
+     if (tick != CHANGEDTICK(curbuf))
+       u_save(curwin->w_cursor.lnum, (linenr_T)(curwin->w_cursor.lnum + 1));
+ 
+     return r;
+ }
*** ../vim-8.1.0255/src/testdir/test_autocmd.vim        2018-08-07 
19:04:57.409627129 +0200
--- src/testdir/test_autocmd.vim        2018-08-08 21:43:44.368570016 +0200
***************
*** 1329,1338 ****
    call assert_equal('(', getline(1))
    call assert_equal('x)', getline(2))
    undo
-   call assert_equal('(', getline(1))
-   call assert_equal('', getline(2))
-   undo
    call assert_equal('', getline(1))
  
    call test_override('starting', 0)
    bwipe!
--- 1329,1336 ----
    call assert_equal('(', getline(1))
    call assert_equal('x)', getline(2))
    undo
    call assert_equal('', getline(1))
+   call assert_equal('', getline(2))
  
    call test_override('starting', 0)
    bwipe!
*** ../vim-8.1.0255/src/version.c       2018-08-08 11:02:26.855415573 +0200
--- src/version.c       2018-08-08 21:43:06.112860972 +0200
***************
*** 796,797 ****
--- 796,799 ----
  {   /* Add new patch number below this line */
+ /**/
+     256,
  /**/

-- 
If "R" is Reverse, how come "D" is FORWARD?

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            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].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui