Skip to content

Commit

Permalink
patch 8.2.3593: directory is wrong after executing "lcd" with win_exe…
Browse files Browse the repository at this point in the history
…cute()

Problem:    Directory is wrong after executing "lcd" with win_execute().
Solution:   Correct the directory when going back to the original window.
            (closes #9132)
  • Loading branch information
brammool committed Nov 14, 2021
1 parent 6a950a6 commit 7f13b24
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 30 deletions.
4 changes: 4 additions & 0 deletions src/evalwindow.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions src/proto/window.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
12 changes: 12 additions & 0 deletions src/testdir/test_execute_func.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -757,6 +757,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3593,
/**/
3592,
/**/
Expand Down
69 changes: 39 additions & 30 deletions src/window.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 7f13b24

Please sign in to comment.