diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-11-13 13:53:21 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2023-11-13 13:58:32 +0800 |
commit | c23c44f845c8d357093d87f6e2e5636d2a11a8fb (patch) | |
tree | f220a9b3337ba1eed73c4cc9269cf88c1ff2db5c /src/nvim/ex_session.c | |
parent | 3d9593523d0b3a4280f8f661818a7da0106556d4 (diff) | |
download | rneovim-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/nvim/ex_session.c')
-rw-r--r-- | src/nvim/ex_session.c | 31 |
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) { |