1
0
forked from aniani/vim

patch 8.2.3933: after ":cd" fails ":cd -" is incorrect

Problem:    After ":cd" fails ":cd -" is incorrect.
Solution:   Set the previous directory only after successfully changing
            directory. (Richard Doty, closes #9419, closes #8983)
This commit is contained in:
Richard Doty
2021-12-29 14:39:08 +00:00
committed by Bram Moolenaar
parent 264d3ddac0
commit 3d0abad5bf
3 changed files with 25 additions and 14 deletions

View File

@@ -7359,7 +7359,6 @@ changedir_func(
int forceit,
cdscope_T scope)
{
char_u *tofree;
char_u *pdir = NULL;
int dir_differs;
int retval = FALSE;
@@ -7385,20 +7384,11 @@ changedir_func(
new_dir = pdir;
}
// Free the previous directory
tofree = get_prevdir(scope);
// Save current directory for next ":cd -"
if (mch_dirname(NameBuff, MAXPATHL) == OK)
pdir = vim_strsave(NameBuff);
else
pdir = NULL;
if (scope == CDSCOPE_WINDOW)
curwin->w_prevdir = pdir;
else if (scope == CDSCOPE_TABPAGE)
curtab->tp_prevdir = pdir;
else
prev_dir = pdir;
// For UNIX ":cd" means: go to home directory.
// On other systems too if 'cdhome' is set.
@@ -7425,10 +7415,23 @@ changedir_func(
dir_differs = new_dir == NULL || pdir == NULL
|| pathcmp((char *)pdir, (char *)new_dir, -1) != 0;
if (new_dir == NULL || (dir_differs && vim_chdir(new_dir)))
{
emsg(_(e_failed));
vim_free(pdir);
}
else
{
char_u *acmd_fname;
char_u **pp;
if (scope == CDSCOPE_WINDOW)
pp = &curwin->w_prevdir;
else if (scope == CDSCOPE_TABPAGE)
pp = &curtab->tp_prevdir;
else
pp = &prev_dir;
vim_free(*pp);
*pp = pdir;
post_chdir(scope);
@@ -7445,7 +7448,6 @@ changedir_func(
}
retval = TRUE;
}
vim_free(tofree);
return retval;
}
@@ -7565,9 +7567,9 @@ do_sleep(long msec, int hide_cursor)
# endif
if (hide_cursor)
cursor_sleep();
cursor_sleep();
else
cursor_on();
cursor_on();
out_flush_cursor(FALSE, FALSE);
while (!got_int && done < msec)
@@ -7619,7 +7621,7 @@ do_sleep(long msec, int hide_cursor)
(void)vpeekc();
if (hide_cursor)
cursor_unsleep();
cursor_unsleep();
}
/*