1
0
forked from aniani/vim

patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments

Problem:    Mksession mixes up "tabpages" and "curdir" arguments.
Solution:   Correct logic for storing tabpage in session. (closes #10312)
This commit is contained in:
LemonBoy
2022-04-30 16:10:27 +01:00
committed by Bram Moolenaar
parent 917c32c4f7
commit d7c9564d8d
3 changed files with 52 additions and 21 deletions

View File

@@ -623,13 +623,13 @@ makeopens(
win_T *wp;
char_u *sname;
win_T *edited_win = NULL;
int tabnr;
int restore_stal = FALSE;
win_T *tab_firstwin;
frame_T *tab_topframe;
int cur_arg_idx = 0;
int next_arg_idx = 0;
int ret = FAIL;
tabpage_T *tp;
#ifdef FEAT_TERMINAL
hashtab_T terminal_bufs;
@@ -755,18 +755,11 @@ makeopens(
restore_stal = TRUE;
}
// May repeat putting Windows for each tab, when "tabpages" is in
// 'sessionoptions'.
// Don't use goto_tabpage(), it may change directory and trigger
// autocommands.
tab_firstwin = firstwin; // first window in tab page "tabnr"
tab_topframe = topframe;
if ((ssop_flags & SSOP_TABPAGES))
{
tabpage_T *tp;
// Similar to ses_win_rec() below, populate the tab pages first so
// later local options won't be copied to the new tabs.
// "tabpages" is in 'sessionoptions': Similar to ses_win_rec() below,
// populate the tab pages first so later local options won't be copied
// to the new tabs.
FOR_ALL_TABPAGES(tp)
// Use `bufhidden=wipe` to remove empty "placeholder" buffers once
// they are not needed. This prevents creating extra buffers (see
@@ -777,18 +770,20 @@ makeopens(
if (first_tabpage->tp_next != NULL && put_line(fd, "tabrewind") == FAIL)
goto fail;
}
for (tabnr = 1; ; ++tabnr)
// Assume "tabpages" is in 'sessionoptions'. If not then we only do
// "curtab" and bail out of the loop.
FOR_ALL_TABPAGES(tp)
{
tabpage_T *tp = NULL;
int need_tabnext = FALSE;
int cnr = 1;
// May repeat putting Windows for each tab, when "tabpages" is in
// 'sessionoptions'.
// Don't use goto_tabpage(), it may change directory and trigger
// autocommands.
if ((ssop_flags & SSOP_TABPAGES))
{
tp = find_tabpage(tabnr);
if (tp == NULL)
break; // done all tab pages
if (tp == curtab)
{
tab_firstwin = firstwin;
@@ -799,9 +794,15 @@ makeopens(
tab_firstwin = tp->tp_firstwin;
tab_topframe = tp->tp_topframe;
}
if (tabnr > 1)
if (tp != first_tabpage)
need_tabnext = TRUE;
}
else
{
tp = curtab;
tab_firstwin = firstwin;
tab_topframe = topframe;
}
// Before creating the window layout, try loading one file. If this
// is aborted we don't end up with a number of useless windows.
@@ -893,11 +894,11 @@ makeopens(
// Restore the tab-local working directory if specified
// Do this before the windows, so that the window-local directory can
// override the tab-local directory.
if (tp != NULL && tp->tp_localdir != NULL && ssop_flags & SSOP_CURDIR)
if ((ssop_flags & SSOP_CURDIR) && tp->tp_localdir != NULL)
{
if (fputs("tcd ", fd) < 0
|| ses_put_fname(fd, tp->tp_localdir, &ssop_flags) == FAIL
|| put_eol(fd) == FAIL)
|| ses_put_fname(fd, tp->tp_localdir, &ssop_flags) == FAIL
|| put_eol(fd) == FAIL)
goto fail;
did_lcd = TRUE;
}