1
0
forked from aniani/vim

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.
This commit is contained in:
Bram Moolenaar
2021-12-28 13:15:05 +00:00
parent 8b6256f6ec
commit 90c317f224
3 changed files with 41 additions and 4 deletions

View File

@@ -707,6 +707,21 @@ f_win_execute(typval_T *argvars, typval_T *rettv)
if (wp != NULL && tp != NULL) if (wp != NULL && tp != NULL)
{ {
pos_T curpos = wp->w_cursor; 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) 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); execute_common(argvars, rettv, 1);
} }
restore_win_noblock(save_curwin, save_curtab, TRUE); 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. // Update the status line if the cursor moved.
if (win_valid(wp) && !EQUAL_POS(curpos, wp->w_cursor)) if (win_valid(wp) && !EQUAL_POS(curpos, wp->w_cursor))
@@ -1316,9 +1335,5 @@ restore_win_noblock(
// to the first valid window. // to the first valid window.
win_goto(firstwin); win_goto(firstwin);
# endif # endif
// If called by win_execute() and executing the command changed the
// directory, it now has to be restored.
fix_current_dir();
} }
#endif #endif

View File

@@ -51,6 +51,26 @@ func Test_set_filename_other_window()
endtry endtry
endfunc 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() func Test_verbose_pwd()
let cwd = getcwd() let cwd = getcwd()
call test_autochdir() call test_autochdir()

View File

@@ -749,6 +749,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3920,
/**/ /**/
3919, 3919,
/**/ /**/