@@ -1433,9 +1433,9 @@ aucmd_prepbuf(
14331433 // window. Expect a few side effects...
14341434 win = curwin ;
14351435
1436- aco -> save_curwin = curwin ;
1436+ aco -> save_curwin_id = curwin -> w_id ;
14371437 aco -> save_curbuf = curbuf ;
1438- aco -> save_prevwin = prevwin ;
1438+ aco -> save_prevwin_id = prevwin == NULL ? 0 : prevwin -> w_id ;
14391439 if (win != NULL )
14401440 {
14411441 // There is a window for "buf" in the current tab page, make it the
@@ -1481,7 +1481,7 @@ aucmd_prepbuf(
14811481 curwin = aucmd_win ;
14821482 }
14831483 curbuf = buf ;
1484- aco -> new_curwin = curwin ;
1484+ aco -> new_curwin_id = curwin -> w_id ;
14851485 set_bufref (& aco -> new_curbuf , curbuf );
14861486}
14871487
@@ -1493,7 +1493,8 @@ aucmd_prepbuf(
14931493aucmd_restbuf (
14941494 aco_save_T * aco ) // structure holding saved values
14951495{
1496- int dummy ;
1496+ int dummy ;
1497+ win_T * save_curwin ;
14971498
14981499 if (aco -> use_aucmd_win )
14991500 {
@@ -1533,8 +1534,9 @@ aucmd_restbuf(
15331534 (void )win_comp_pos (); // recompute window positions
15341535 unblock_autocmds ();
15351536
1536- if (win_valid (aco -> save_curwin ))
1537- curwin = aco -> save_curwin ;
1537+ save_curwin = win_find_by_id (aco -> save_curwin_id );
1538+ if (save_curwin != NULL )
1539+ curwin = save_curwin ;
15381540 else
15391541 // Hmm, original window disappeared. Just use the first one.
15401542 curwin = firstwin ;
@@ -1543,9 +1545,7 @@ aucmd_restbuf(
15431545 // May need to restore insert mode for a prompt buffer.
15441546 entering_window (curwin );
15451547#endif
1546-
1547- if (win_valid (aco -> save_prevwin ))
1548- prevwin = aco -> save_prevwin ;
1548+ prevwin = win_find_by_id (aco -> save_prevwin_id );
15491549#ifdef FEAT_EVAL
15501550 vars_clear (& aucmd_win -> w_vars -> dv_hashtab ); // free all w: variables
15511551 hash_init (& aucmd_win -> w_vars -> dv_hashtab ); // re-use the hashtab
@@ -1571,13 +1571,15 @@ aucmd_restbuf(
15711571 }
15721572 else
15731573 {
1574- // restore curwin
1575- if (win_valid (aco -> save_curwin ))
1574+ // Restore curwin. Use the window ID, a window may have been closed
1575+ // and the memory re-used for another one.
1576+ save_curwin = win_find_by_id (aco -> save_curwin_id );
1577+ if (save_curwin != NULL )
15761578 {
15771579 // Restore the buffer which was previously edited by curwin, if
15781580 // it was changed, we are still the same window and the buffer is
15791581 // valid.
1580- if (curwin == aco -> new_curwin
1582+ if (curwin -> w_id == aco -> new_curwin_id
15811583 && curbuf != aco -> new_curbuf .br_buf
15821584 && bufref_valid (& aco -> new_curbuf )
15831585 && aco -> new_curbuf .br_buf -> b_ml .ml_mfp != NULL )
@@ -1592,10 +1594,9 @@ aucmd_restbuf(
15921594 ++ curbuf -> b_nwindows ;
15931595 }
15941596
1595- curwin = aco -> save_curwin ;
1597+ curwin = save_curwin ;
15961598 curbuf = curwin -> w_buffer ;
1597- if (win_valid (aco -> save_prevwin ))
1598- prevwin = aco -> save_prevwin ;
1599+ prevwin = win_find_by_id (aco -> save_prevwin_id );
15991600 // In case the autocommand moves the cursor to a position that
16001601 // does not exist in curbuf.
16011602 check_cursor ();
0 commit comments