]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1450: Session has wrong arglist with :tcd and :arglocal v9.1.1450
authorzeertzjq <zeertzjq@outlook.com>
Tue, 10 Jun 2025 18:31:44 +0000 (20:31 +0200)
committerChristian Brabandt <cb@256bit.org>
Tue, 10 Jun 2025 18:31:44 +0000 (20:31 +0200)
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: #17503

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/arglist.c
src/session.c
src/testdir/test_mksession.vim
src/version.c

index 4eec079df438a3bb41ceff3bc3370ecf5cb18253..bfc8bbd1213329bd03ca6a909fd790950fb4b3aa 100644 (file)
@@ -561,7 +561,7 @@ check_arg_idx(win_T *win)
 }
 
 /*
- * ":args", ":argslocal" and ":argsglobal".
+ * ":args", ":arglocal" and ":argglobal".
  */
     void
 ex_args(exarg_T *eap)
index 8dd0bc3642e29db1d0281e8023ad1e0ab71d33f9..34ecd9fe82300d7fbffcb6e5b51e8a81b1a350d5 100644 (file)
@@ -301,6 +301,7 @@ put_view_curpos(FILE *fd, win_T *wp, char *spaces)
 put_view(
     FILE       *fd,
     win_T      *wp,
+    tabpage_T  *tp,
     int                add_edit,            // add ":edit" command to view
     unsigned   *flagp,              // vop_flags or ssop_flags
     int                current_arg_idx,     // current argument index of the window,
@@ -328,6 +329,7 @@ put_view(
        if (ses_arglist(fd, "arglocal", &wp->w_alist->al_ga,
                        flagp == &vop_flags
                        || !(*flagp & SSOP_CURDIR)
+                       || tp->tp_localdir != NULL
                        || wp->w_localdir != NULL, flagp) == FAIL)
            return FAIL;
     }
@@ -899,7 +901,8 @@ makeopens(
        {
            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,
 #ifdef FEAT_TERMINAL
                                                         &terminal_bufs
 #else
@@ -1335,8 +1338,8 @@ ex_mkrc(exarg_T   *eap)
            }
            else
            {
-               failed |= (put_view(fd, curwin, !using_vdir, flagp, -1, NULL)
-                                                                     == FAIL);
+               failed |= (put_view(fd, curwin, curtab, !using_vdir, flagp, -1,
+                                                               NULL) == FAIL);
            }
            if (put_line(fd, "let &g:so = s:so_save | let &g:siso = s:siso_save")
                                                                      == FAIL)
index bbb42f94ce335bd6242a26707f42d67fa42dfd3c..8217d91b8ca7b2680e1b27f28a74998678b15ec8 100644 (file)
@@ -32,6 +32,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
index 3983083b482bfcfbaebfa1cf87556c09e62b4e36..80b5f030a37e0d1991e37b39663c21b89333ae29 100644 (file)
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1450,
 /**/
     1449,
 /**/