]> granicus.if.org Git - vim/commitdiff
patch 8.2.3593: directory is wrong after executing "lcd" with win_execute() v8.2.3593
authorBram Moolenaar <Bram@vim.org>
Sun, 14 Nov 2021 11:41:31 +0000 (11:41 +0000)
committerBram Moolenaar <Bram@vim.org>
Sun, 14 Nov 2021 11:41:31 +0000 (11:41 +0000)
Problem:    Directory is wrong after executing "lcd" with win_execute().
Solution:   Correct the directory when going back to the original window.
            (closes #9132)

src/evalwindow.c
src/proto/window.pro
src/testdir/test_execute_func.vim
src/version.c
src/window.c

index f043c6f4d796a7f19a46ae3a280eadefd7f96ebc..c90571557d766b0ba886876af51657d03fb7bea5 100644 (file)
@@ -1311,5 +1311,9 @@ restore_win_noblock(
        // to the first valid window.
        win_goto(firstwin);
 # endif
+
+    // If called by win_execute() and executing the command changed the
+    // directory, it now has to be restored.
+    fix_current_dir();
 }
 #endif
index c10b61dba44a672beb63aa2588cf6a2606a15e69..93264e1ad23df10c73e99be861cd9857b627182f 100644 (file)
@@ -43,6 +43,7 @@ tabpage_T *win_find_tabpage(win_T *win);
 win_T *win_vert_neighbor(tabpage_T *tp, win_T *wp, int up, long count);
 win_T *win_horz_neighbor(tabpage_T *tp, win_T *wp, int left, long count);
 void win_enter(win_T *wp, int undo_sync);
+void fix_current_dir(void);
 win_T *buf_jump_open_win(buf_T *buf);
 win_T *buf_jump_open_tab(buf_T *buf);
 void win_free_popup(win_T *win);
index 2652ba170a9f1710006b460c7c5c100bb1207d9b..2a84706ad58c1bd32b04d271947fa89024613c57 100644 (file)
@@ -105,6 +105,18 @@ func Test_win_execute()
 
   call win_gotoid(otherwin)
   bwipe!
+
+  " check :lcd in another window does not change directory
+  let curid = win_getid()
+  let curdir = getcwd()
+  split Xother
+  lcd ..
+  " Use :pwd to get the actual current directory
+  let otherdir = execute('pwd')
+  call win_execute(curid, 'lcd testdir')
+  call assert_equal(otherdir, execute('pwd'))
+  bwipe!
+  execute 'cd ' .. curdir
 endfunc
 
 func Test_win_execute_update_ruler()
index c0acd4b676f7cd27e749888e069357c8f28886aa..1664f21c3056a39f99d0540605eb1e7fe5722cb6 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3593,
 /**/
     3592,
 /**/
index 226d6c1a405c34bfb121ca157b709093e101eba9..5473aaba60e374780a18387cdd1d6ff05f03003c 100644 (file)
@@ -4796,36 +4796,7 @@ win_enter_ext(win_T *wp, int flags)
     }
 #endif
 
-    if (curwin->w_localdir != NULL || curtab->tp_localdir != NULL)
-    {
-       char_u  *dirname;
-
-       // Window or tab has a local directory: Save current directory as
-       // global directory (unless that was done already) and change to the
-       // local directory.
-       if (globaldir == NULL)
-       {
-           char_u      cwd[MAXPATHL];
-
-           if (mch_dirname(cwd, MAXPATHL) == OK)
-               globaldir = vim_strsave(cwd);
-       }
-       if (curwin->w_localdir != NULL)
-           dirname = curwin->w_localdir;
-       else
-           dirname = curtab->tp_localdir;
-
-       if (mch_chdir((char *)dirname) == 0)
-           shorten_fnames(TRUE);
-    }
-    else if (globaldir != NULL)
-    {
-       // Window doesn't have a local directory and we are not in the global
-       // directory: Change to the global directory.
-       vim_ignored = mch_chdir((char *)globaldir);
-       VIM_CLEAR(globaldir);
-       shorten_fnames(TRUE);
-    }
+    fix_current_dir();
 
 #ifdef FEAT_JOB_CHANNEL
     entering_window(curwin);
@@ -4875,6 +4846,44 @@ win_enter_ext(win_T *wp, int flags)
     return did_decrement;
 }
 
+/*
+ * Used after making another window the current one: change directory if
+ * needed.
+ */
+    void
+fix_current_dir(void)
+{
+    if (curwin->w_localdir != NULL || curtab->tp_localdir != NULL)
+    {
+       char_u  *dirname;
+
+       // Window or tab has a local directory: Save current directory as
+       // global directory (unless that was done already) and change to the
+       // local directory.
+       if (globaldir == NULL)
+       {
+           char_u      cwd[MAXPATHL];
+
+           if (mch_dirname(cwd, MAXPATHL) == OK)
+               globaldir = vim_strsave(cwd);
+       }
+       if (curwin->w_localdir != NULL)
+           dirname = curwin->w_localdir;
+       else
+           dirname = curtab->tp_localdir;
+
+       if (mch_chdir((char *)dirname) == 0)
+           shorten_fnames(TRUE);
+    }
+    else if (globaldir != NULL)
+    {
+       // Window doesn't have a local directory and we are not in the global
+       // directory: Change to the global directory.
+       vim_ignored = mch_chdir((char *)globaldir);
+       VIM_CLEAR(globaldir);
+       shorten_fnames(TRUE);
+    }
+}
 
 /*
  * Jump to the first open window that contains buffer "buf", if one exists.