diff options
-rw-r--r-- | src/arglist.c | 4 | ||||
-rw-r--r-- | src/globals.h | 5 | ||||
-rw-r--r-- | src/testdir/test_tabpage.vim | 19 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/window.c | 3 |
5 files changed, 31 insertions, 2 deletions
diff --git a/src/arglist.c b/src/arglist.c index a63f6c72f8..d28b31da43 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 d54e311837..c03fe97db9 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 eed26f7221..906fefcab6 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 a81665af11..03f44e4626 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2168, +/**/ 2167, /**/ 2166, diff --git a/src/window.c b/src/window.c index be010dc7fd..9f80657124 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; |