diff --git a/src/arglist.c b/src/arglist.c index a63f6c72f..d28b31da4 100644 --- a/src/arglist.c +++ b/src/arglist.c @@ -983,6 +983,9 @@ arg_all_close_unused_windows(arg_all_state_T *aall) if (aall->had_tab > 0) goto_tabpage_tp(first_tabpage, TRUE, TRUE); + + // moving tabpages around in an autocommand may cause an endless loop + tabpage_move_disallowed++; for (;;) { tpnext = curtab->tp_next; @@ -1093,6 +1096,7 @@ arg_all_close_unused_windows(arg_all_state_T *aall) goto_tabpage_tp(tpnext, TRUE, TRUE); } + tabpage_move_disallowed--; } /* diff --git a/src/globals.h b/src/globals.h index d54e31183..c03fe97db 100644 --- a/src/globals.h +++ b/src/globals.h @@ -792,8 +792,9 @@ EXTERN int is_mac_terminal INIT(= FALSE); // recognized Terminal.app #endif EXTERN int autocmd_busy INIT(= FALSE); // Is apply_autocmds() busy? -EXTERN int autocmd_no_enter INIT(= FALSE); // *Enter autocmds disabled -EXTERN int autocmd_no_leave INIT(= FALSE); // *Leave autocmds disabled +EXTERN int autocmd_no_enter INIT(= FALSE); // Buf/WinEnter autocmds disabled +EXTERN int autocmd_no_leave INIT(= FALSE); // Buf/WinLeave autocmds disabled +EXTERN int tabpage_move_disallowed INIT(= FALSE); // moving tabpages around disallowed EXTERN int modified_was_set; // did ":set modified" EXTERN int did_filetype INIT(= FALSE); // FileType event found diff --git a/src/testdir/test_tabpage.vim b/src/testdir/test_tabpage.vim index eed26f722..906fefcab 100644 --- a/src/testdir/test_tabpage.vim +++ b/src/testdir/test_tabpage.vim @@ -903,4 +903,23 @@ func Test_tabpage_last_line() bwipe! endfunc +" this was causing an endless loop +func Test_tabpage_drop_tabmove() + augroup TestTabpageTabmove + au! + autocmd! TabEnter * :if tabpagenr() > 1 | tabmove - | endif + augroup end + $tab drop XTab_99.log + $tab drop XTab_98.log + $tab drop XTab_97.log + + autocmd! TestTabpageTabmove + augroup! TestTabpageTabmove + + " clean up + bwipe! + bwipe! + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index a81665af1..03f44e462 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2168, /**/ 2167, /**/ diff --git a/src/window.c b/src/window.c index be010dc7f..9f8065712 100644 --- a/src/window.c +++ b/src/window.c @@ -4970,6 +4970,9 @@ tabpage_move(int nr) if (first_tabpage->tp_next == NULL) return; + if (tabpage_move_disallowed) + return; + for (tp = first_tabpage; tp->tp_next != NULL && n < nr; tp = tp->tp_next) ++n;