summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-12-28 13:15:05 +0000
committerBram Moolenaar <Bram@vim.org>2021-12-28 13:15:05 +0000
commit90c317f2246a7fb4bd4e3feb0778b53627bc9fad (patch)
tree0f765598411fe6bab0519ddb7f1ee4daebb80c67
parent8b6256f6ec075cca40341e61ebc9f538b4902dd1 (diff)
downloadvim-git-8.2.3920.tar.gz
patch 8.2.3920: restoring directory after using another window is inefficientv8.2.3920
Problem: Restoring directory after using another window is inefficient. Solution: Only restore the directory for win_execute(). Apply 'autochdir' only when needed.
-rw-r--r--src/evalwindow.c23
-rw-r--r--src/testdir/test_autochdir.vim20
-rw-r--r--src/version.c2
3 files changed, 41 insertions, 4 deletions
diff --git a/src/evalwindow.c b/src/evalwindow.c
index 794d6aa0b..ebab85614 100644
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -707,6 +707,21 @@ f_win_execute(typval_T *argvars, typval_T *rettv)
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_T *rettv)
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
diff --git a/src/testdir/test_autochdir.vim b/src/testdir/test_autochdir.vim
index 861db7247..5d367757f 100644
--- 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()
diff --git a/src/version.c b/src/version.c
index 2045de932..8963062fc 100644
--- 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,