diff src/autocmd.c @ 24110:03438d77d8ab v8.2.2596

patch 8.2.2596: :doautocmd may confuse scripts listening to WinEnter Commit: https://github.com/vim/vim/commit/41cd80335cf318c15c8b0139f53ab5e8a02561ef Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 13 15:47:56 2021 +0100 patch 8.2.2596: :doautocmd may confuse scripts listening to WinEnter Problem: :doautocmd may confuse scripts listening to WinEnter. Solution: Do the current buffer last. (closes https://github.com/vim/vim/issues/7958)
author Bram Moolenaar <Bram@vim.org>
date Sat, 13 Mar 2021 16:00:03 +0100
parents 97296182d336
children f8619a303e9d
line wrap: on
line diff
--- a/src/autocmd.c
+++ b/src/autocmd.c
@@ -1336,7 +1336,7 @@ do_doautocmd(
     void
 ex_doautoall(exarg_T *eap)
 {
-    int		retval;
+    int		retval = OK;
     aco_save_T	aco;
     buf_T	*buf;
     bufref_T	bufref;
@@ -1353,7 +1353,8 @@ ex_doautoall(exarg_T *eap)
      */
     FOR_ALL_BUFFERS(buf)
     {
-	if (buf->b_ml.ml_mfp != NULL)
+	// Only do loaded buffers and skip the current buffer, it's done last.
+	if (buf->b_ml.ml_mfp != NULL && buf != curbuf)
 	{
 	    // find a window for this buffer and save some values
 	    aucmd_prepbuf(&aco, buf);
@@ -1363,22 +1364,31 @@ ex_doautoall(exarg_T *eap)
 	    retval = do_doautocmd(arg, FALSE, &did_aucmd);
 
 	    if (call_do_modelines && did_aucmd)
-	    {
 		// Execute the modeline settings, but don't set window-local
 		// options if we are using the current window for another
 		// buffer.
 		do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
-	    }
 
 	    // restore the current window
 	    aucmd_restbuf(&aco);
 
 	    // stop if there is some error or buffer was deleted
 	    if (retval == FAIL || !bufref_valid(&bufref))
+	    {
+		retval = FAIL;
 		break;
+	    }
 	}
     }
 
+    // Execute autocommands for the current buffer last.
+    if (retval == OK)
+    {
+	do_doautocmd(arg, FALSE, &did_aucmd);
+	if (call_do_modelines && did_aucmd)
+	    do_modelines(0);
+    }
+
     check_cursor();	    // just in case lines got deleted
 }
 
@@ -2166,12 +2176,14 @@ apply_autocmds_group(
 	while (au_pending_free_buf != NULL)
 	{
 	    buf_T *b = au_pending_free_buf->b_next;
+
 	    vim_free(au_pending_free_buf);
 	    au_pending_free_buf = b;
 	}
 	while (au_pending_free_win != NULL)
 	{
 	    win_T *w = au_pending_free_win->w_next;
+
 	    vim_free(au_pending_free_win);
 	    au_pending_free_win = w;
 	}