forked from aniani/vim
patch 8.2.3593: directory is wrong after executing "lcd" with win_execute()
Problem: Directory is wrong after executing "lcd" with win_execute(). Solution: Correct the directory when going back to the original window. (closes #9132)
This commit is contained in:
@@ -1311,5 +1311,9 @@ 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
|
||||||
|
@@ -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_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);
|
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 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_win(buf_T *buf);
|
||||||
win_T *buf_jump_open_tab(buf_T *buf);
|
win_T *buf_jump_open_tab(buf_T *buf);
|
||||||
void win_free_popup(win_T *win);
|
void win_free_popup(win_T *win);
|
||||||
|
@@ -105,6 +105,18 @@ func Test_win_execute()
|
|||||||
|
|
||||||
call win_gotoid(otherwin)
|
call win_gotoid(otherwin)
|
||||||
bwipe!
|
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
|
endfunc
|
||||||
|
|
||||||
func Test_win_execute_update_ruler()
|
func Test_win_execute_update_ruler()
|
||||||
|
@@ -757,6 +757,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 */
|
||||||
|
/**/
|
||||||
|
3593,
|
||||||
/**/
|
/**/
|
||||||
3592,
|
3592,
|
||||||
/**/
|
/**/
|
||||||
|
69
src/window.c
69
src/window.c
@@ -4796,36 +4796,7 @@ win_enter_ext(win_T *wp, int flags)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (curwin->w_localdir != NULL || curtab->tp_localdir != NULL)
|
fix_current_dir();
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef FEAT_JOB_CHANNEL
|
#ifdef FEAT_JOB_CHANNEL
|
||||||
entering_window(curwin);
|
entering_window(curwin);
|
||||||
@@ -4875,6 +4846,44 @@ win_enter_ext(win_T *wp, int flags)
|
|||||||
return did_decrement;
|
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.
|
* Jump to the first open window that contains buffer "buf", if one exists.
|
||||||
|
Reference in New Issue
Block a user