commit 612f8e7c9e8192a3399ba4103427189a69f2c083
parent cbc9d9b9c741b88d5aa791e27b9b693f4737f374
Author: zeertzjq <zeertzjq@outlook.com>
Date: Wed, 11 Jun 2025 07:35:42 +0800
vim-patch:9.1.1450: Session has wrong arglist with :tcd and :arglocal (#34430)
Problem: Session has wrong arglist with :tcd and :arglocal.
Solution: Also use absolute path for :argadd when there is tabpage-local
directory (zeertzjq).
related: neovim/neovim#34405
closes: vim/vim#17503
https://github.com/vim/vim/commit/a304e49790280d9e3201648eb5ec8ba1ac55b175
Diffstat:
3 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/src/nvim/arglist.c b/src/nvim/arglist.c
@@ -525,7 +525,7 @@ void check_arg_idx(win_T *win)
}
}
-/// ":args", ":argslocal" and ":argsglobal".
+/// ":args", ":arglocal" and ":argglobal".
void ex_args(exarg_T *eap)
{
if (eap->cmdidx != CMD_args) {
diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c
@@ -323,7 +323,8 @@ static int ses_put_fname(FILE *fd, char *name, unsigned *flagp)
/// @param add_edit add ":edit" command to view
/// @param flagp vop_flags or ssop_flags
/// @param current_arg_idx current argument index of the window, use -1 if unknown
-static int put_view(FILE *fd, win_T *wp, int add_edit, unsigned *flagp, int current_arg_idx)
+static int put_view(FILE *fd, win_T *wp, tabpage_T *tp, bool add_edit, unsigned *flagp,
+ int current_arg_idx)
{
int f;
bool did_next = false;
@@ -339,6 +340,7 @@ static int put_view(FILE *fd, win_T *wp, int add_edit, unsigned *flagp, int curr
if (ses_arglist(fd, "arglocal", &wp->w_alist->al_ga,
flagp == &vop_flags
|| !(*flagp & kOptSsopFlagCurdir)
+ || tp->tp_localdir != NULL
|| wp->w_localdir != NULL, flagp) == FAIL) {
return FAIL;
}
@@ -831,7 +833,7 @@ static int makeopens(FILE *fd, char *dirnow)
if (!ses_do_win(wp)) {
continue;
}
- if (put_view(fd, wp, wp != edited_win, &ssop_flags, cur_arg_idx)
+ if (put_view(fd, wp, tp, wp != edited_win, &ssop_flags, cur_arg_idx)
== FAIL) {
return FAIL;
}
@@ -1049,7 +1051,7 @@ void ex_mkrc(exarg_T *eap)
}
xfree(dirnow);
} else {
- failed |= (put_view(fd, curwin, !using_vdir, flagp, -1) == FAIL);
+ failed |= (put_view(fd, curwin, curtab, !using_vdir, flagp, -1) == FAIL);
}
if (fprintf(fd,
"%s",
diff --git a/test/old/testdir/test_mksession.vim b/test/old/testdir/test_mksession.vim
@@ -31,6 +31,42 @@ func Test__mksession_arglocal()
call delete('Xtest_mks.out')
endfunc
+func Test_mksession_arglocal_localdir()
+ call mkdir('Xa', 'R')
+ call writefile(['This is Xb'], 'Xa/Xb.txt', 'D')
+ let olddir = getcwd()
+ let oldargs = argv()
+
+ for tabpage in [v:false, v:true]
+ let msg = tabpage ? 'tabpage-local' : 'window-local'
+
+ exe tabpage ? 'tabnew' : 'botright new'
+ exe tabpage ? 'tcd Xa' : 'lcd Xa'
+ let localdir = getcwd()
+ arglocal
+ $argadd Xb.txt
+ let localargs = argv()
+ exe tabpage ? 'tabprev' : 'wincmd p'
+ call assert_equal(olddir, getcwd(), msg)
+ call assert_equal(oldargs, argv(), msg)
+ mksession! Xtest_mks_localdir.out
+ exe tabpage ? '+tabclose' : '$close'
+ bwipe! Xa/Xb.txt
+
+ source Xtest_mks_localdir.out
+ exe tabpage ? 'tabnext' : 'wincmd b'
+ call assert_equal(localdir, getcwd(), msg)
+ call assert_equal(localargs, argv(), msg)
+ $argument
+ call assert_equal('This is Xb', getline(1), msg)
+
+ bwipe!
+ call assert_equal(olddir, getcwd(), msg)
+ call assert_equal(oldargs, argv(), msg)
+ call delete('Xtest_mks_localdir.out')
+ endfor
+endfunc
+
func Test_mksession()
tabnew
let wrap_save = &wrap