changeset 26784:c95a3f25b6b1 v8.2.3920

patch 8.2.3920: restoring directory after using another window is inefficient Commit: https://github.com/vim/vim/commit/90c317f2246a7fb4bd4e3feb0778b53627bc9fad Author: Bram Moolenaar <Bram@vim.org> Date: Tue Dec 28 13:15:05 2021 +0000 patch 8.2.3920: restoring directory after using another window is inefficient Problem: Restoring directory after using another window is inefficient. Solution: Only restore the directory for win_execute(). Apply 'autochdir' only when needed.
author Bram Moolenaar <Bram@vim.org>
date Tue, 28 Dec 2021 14:30:04 +0100
parents 9d4f5096b3ea
children a9a760590e20
files src/evalwindow.c src/testdir/test_autochdir.vim src/version.c
diffstat 3 files changed, 41 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -707,6 +707,21 @@ f_win_execute(typval_T *argvars, typval_
     if (wp != NULL && tp != NULL)
     {
 	pos_T	curpos = wp->w_cursor;
+	char_u	cwd[MAXPATHL];
+	int	cwd_status;
+	char_u	autocwd[MAXPATHL];
+	int	apply_acd = FALSE;
+
+	cwd_status = mch_dirname(cwd, MAXPATHL);
+
+	// If 'acd' is set, check we are using that directory.  If yes, then
+	// apply 'acd' afterwards, otherwise restore the current directory.
+	if (cwd_status == OK && p_acd)
+	{
+	    do_autochdir();
+	    apply_acd = mch_dirname(autocwd, MAXPATHL) == OK
+						  && STRCMP(cwd, autocwd) == 0;
+	}
 
 	if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, TRUE) == OK)
 	{
@@ -714,6 +729,10 @@ f_win_execute(typval_T *argvars, typval_
 	    execute_common(argvars, rettv, 1);
 	}
 	restore_win_noblock(save_curwin, save_curtab, TRUE);
+	if (apply_acd)
+	    do_autochdir();
+	else if (cwd_status == OK)
+	    mch_chdir((char *)cwd);
 
 	// Update the status line if the cursor moved.
 	if (win_valid(wp) && !EQUAL_POS(curpos, wp->w_cursor))
@@ -1316,9 +1335,5 @@ 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
--- a/src/testdir/test_autochdir.vim
+++ b/src/testdir/test_autochdir.vim
@@ -51,6 +51,26 @@ func Test_set_filename_other_window()
   endtry
 endfunc
 
+func Test_acd_win_execute()
+  let cwd = getcwd()
+  set acd
+  call test_autochdir()
+
+  call mkdir('Xfile')
+  let winid = win_getid()
+  new Xfile/file
+  call assert_match('testdir.Xfile$', getcwd())
+  cd ..
+  call assert_match('testdir$', getcwd())
+  call win_execute(winid, 'echo')
+  call assert_match('testdir$', getcwd())
+
+  bwipe!
+  set noacd
+  call chdir(cwd)
+  call delete('Xfile', 'rf')
+endfunc
+
 func Test_verbose_pwd()
   let cwd = getcwd()
   call test_autochdir()
--- a/src/version.c
+++ b/src/version.c
@@ -750,6 +750,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3920,
+/**/
     3919,
 /**/
     3918,