@@ -270,6 +270,7 @@ func Test_win_tab_autocmd()
270270 let g: record = []
271271
272272 augroup testing
273+ au WinNewPre * call add (g: record , ' WinNewPre' )
273274 au WinNew * call add (g: record , ' WinNew' )
274275 au WinClosed * call add (g: record , ' WinClosed' )
275276 au WinEnter * call add (g: record , ' WinEnter' )
@@ -286,8 +287,8 @@ func Test_win_tab_autocmd()
286287 close
287288
288289 call assert_equal ([
289- \ ' WinLeave' , ' WinNew' , ' WinEnter' ,
290- \ ' WinLeave' , ' TabLeave' , ' WinNew' , ' WinEnter' , ' TabNew' , ' TabEnter' ,
290+ \ ' WinNewPre ' , ' WinLeave' , ' WinNew' , ' WinEnter' ,
291+ \ ' WinLeave' , ' TabLeave' , ' WinNewPre ' , ' WinNew' , ' WinEnter' , ' TabNew' , ' TabEnter' ,
291292 \ ' WinLeave' , ' TabLeave' , ' WinClosed' , ' TabClosed' , ' WinEnter' , ' TabEnter' ,
292293 \ ' WinLeave' , ' WinClosed' , ' WinEnter'
293294 \ ], g: record )
@@ -298,17 +299,96 @@ func Test_win_tab_autocmd()
298299 bwipe somefile
299300
300301 call assert_equal ([
301- \ ' WinLeave' , ' TabLeave' , ' WinNew' , ' WinEnter' , ' TabNew' , ' TabEnter' ,
302+ \ ' WinLeave' , ' TabLeave' , ' WinNewPre ' , ' WinNew' , ' WinEnter' , ' TabNew' , ' TabEnter' ,
302303 \ ' WinLeave' , ' TabLeave' , ' WinEnter' , ' TabEnter' ,
303304 \ ' WinClosed' , ' TabClosed'
304305 \ ], g: record )
305306
307+ let g: record = []
308+ copen
309+ help
310+ tabnext
311+ vnew
312+
313+ call assert_equal ([
314+ \ ' WinNewPre' , ' WinLeave' , ' WinNew' , ' WinEnter' ,
315+ \ ' WinNewPre' , ' WinLeave' , ' WinNew' , ' WinEnter' ,
316+ \ ' WinNewPre' , ' WinLeave' , ' WinNew' , ' WinEnter'
317+ \ ], g: record )
318+
306319 augroup testing
307320 au !
308321 augroup END
309322 unlet g: record
310323endfunc
311324
325+ func Test_WinNewPre ()
326+ " Test that the old window layout can be accessed before a new window is created.
327+ let g: layouts_pre = []
328+ let g: layouts_post = []
329+ augroup testing
330+ au WinNewPre * call add (g: layouts_pre , winlayout ())
331+ au WinNew * call add (g: layouts_post , winlayout ())
332+ augroup END
333+ split
334+ call assert_notequal (g: layouts_pre [0 ], g: layouts_post [0 ])
335+ split
336+ call assert_equal (g: layouts_pre [1 ], g: layouts_post [0 ])
337+ call assert_notequal (g: layouts_pre [1 ], g: layouts_post [1 ])
338+ tabnew
339+ call assert_notequal (g: layouts_pre [2 ], g: layouts_post [1 ])
340+ call assert_notequal (g: layouts_pre [2 ], g: layouts_post [2 ])
341+ augroup testing
342+ au !
343+ augroup END
344+ unlet g: layouts_pre
345+ unlet g: layouts_post
346+
347+ " Test modifying window layout during WinNewPre throws.
348+ let g: caught = 0
349+ augroup testing
350+ au !
351+ au WinNewPre * split
352+ augroup END
353+ try
354+ vnew
355+ catch
356+ let g: caught += 1
357+ endtry
358+ augroup testing
359+ au !
360+ au WinNewPre * tabnew
361+ augroup END
362+ try
363+ vnew
364+ catch
365+ let g: caught += 1
366+ endtry
367+ augroup testing
368+ au !
369+ au WinNewPre * close
370+ augroup END
371+ try
372+ vnew
373+ catch
374+ let g: caught += 1
375+ endtry
376+ augroup testing
377+ au !
378+ au WinNewPre * tabclose
379+ augroup END
380+ try
381+ vnew
382+ catch
383+ let g: caught += 1
384+ endtry
385+ call assert_equal (4 , g: caught )
386+ augroup testing
387+ au !
388+ augroup END
389+ unlet g: caught
390+ endfunc
391+
312392func Test_WinResized ()
313393 CheckRunVimInTerminal
314394
0 commit comments