aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-11-13 13:53:21 +0800
committerzeertzjq <zeertzjq@outlook.com>2023-11-13 13:58:32 +0800
commitc23c44f845c8d357093d87f6e2e5636d2a11a8fb (patch)
treef220a9b3337ba1eed73c4cc9269cf88c1ff2db5c /src
parent3d9593523d0b3a4280f8f661818a7da0106556d4 (diff)
downloadrneovim-c23c44f845c8d357093d87f6e2e5636d2a11a8fb.tar.gz
rneovim-c23c44f845c8d357093d87f6e2e5636d2a11a8fb.tar.bz2
rneovim-c23c44f845c8d357093d87f6e2e5636d2a11a8fb.zip
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 vim/vim#10312) https://github.com/vim/vim/commit/d7c9564d8d24343f2e27205633032dd6ebe5232c Co-authored-by: LemonBoy <thatlemon@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/nvim/ex_session.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c
index 63dfdbc078..3807436efb 100644
--- a/src/nvim/ex_session.c
+++ b/src/nvim/ex_session.c
@@ -537,7 +537,6 @@ static int makeopens(FILE *fd, char *dirnow)
win_T *wp;
char *sname;
win_T *edited_win = NULL;
- int tabnr;
win_T *tab_firstwin;
frame_T *tab_topframe;
int cur_arg_idx = 0;
@@ -644,14 +643,10 @@ static int makeopens(FILE *fd, char *dirnow)
restore_stal = true;
}
- // For each tab:
- // - Put windows for each tab, when "tabpages" is in 'sessionoptions'.
- // - Don't use goto_tabpage(), it may change CWD and trigger autocommands.
- tab_firstwin = firstwin; // First window in tab page "tabnr".
- tab_topframe = topframe;
if ((ssop_flags & SSOP_TABPAGES)) {
- // 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_TABS(tp) {
// Use `bufhidden=wipe` to remove empty "placeholder" buffers once
// they are not needed. This prevents creating extra buffers (see
@@ -665,15 +660,17 @@ static int makeopens(FILE *fd, char *dirnow)
return FAIL;
}
}
- for (tabnr = 1;; tabnr++) {
- tabpage_T *tp = find_tabpage(tabnr);
- if (tp == NULL) {
- break; // done all tab pages
- }
+ // Assume "tabpages" is in 'sessionoptions'. If not then we only do
+ // "curtab" and bail out of the loop.
+ FOR_ALL_TABS(tp) {
bool 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)) {
if (tp == curtab) {
tab_firstwin = firstwin;
@@ -682,9 +679,13 @@ static int makeopens(FILE *fd, char *dirnow)
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
@@ -770,7 +771,7 @@ static int makeopens(FILE *fd, char *dirnow)
// 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) {