summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/arglist.c4
-rw-r--r--src/globals.h5
-rw-r--r--src/testdir/test_tabpage.vim19
-rw-r--r--src/version.c2
-rw-r--r--src/window.c3
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;