summaryrefslogtreecommitdiffstats
path: root/src/ex_docmd.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-05 22:33:42 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-05 22:33:42 +0200
commit002bc79991286934a9593b80635c27d4238cdfc4 (patch)
tree777b6a2574f8dfe4ac76552a0a8e44ba005e7961 /src/ex_docmd.c
parent3fffa97159a427067b60c80ed4645e168cc5c4bd (diff)
patch 8.2.0909: cannot go back to the previous local directoryv8.2.0909
Problem: Cannot go back to the previous local directory. Solution: Add "tcd -" and "lcd -". (Yegappan Lakshmanan, closes #4362)
Diffstat (limited to 'src/ex_docmd.c')
-rw-r--r--src/ex_docmd.c51
1 files changed, 38 insertions, 13 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index a98dc077d8..3a1a61491b 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -6582,6 +6582,19 @@ free_cd_dir(void)
#endif
/*
+ * Get the previous directory for the given chdir scope.
+ */
+ static char_u *
+get_prevdir(cdscope_T scope)
+{
+ if (scope == CDSCOPE_WINDOW)
+ return curwin->w_prevdir;
+ else if (scope == CDSCOPE_TABPAGE)
+ return curtab->tp_prevdir;
+ return prev_dir;
+}
+
+/*
* Deal with the side effects of changing the current directory.
* When 'scope' is CDSCOPE_TABPAGE then this was after an ":tcd" command.
* When 'scope' is CDSCOPE_WINDOW then this was after an ":lcd" command.
@@ -6595,10 +6608,13 @@ post_chdir(cdscope_T scope)
VIM_CLEAR(curwin->w_localdir);
if (scope != CDSCOPE_GLOBAL)
{
- // If still in global directory, need to remember current
- // directory as global directory.
- if (globaldir == NULL && prev_dir != NULL)
- globaldir = vim_strsave(prev_dir);
+ char_u *pdir = get_prevdir(scope);
+
+ // If still in the global directory, need to remember current
+ // directory as the global directory.
+ if (globaldir == NULL && pdir != NULL)
+ globaldir = vim_strsave(pdir);
+
// Remember this local directory for the window.
if (mch_dirname(NameBuff, MAXPATHL) == OK)
{
@@ -6610,8 +6626,7 @@ post_chdir(cdscope_T scope)
}
else
{
- // We are now in the global directory, no need to remember its
- // name.
+ // We are now in the global directory, no need to remember its name.
VIM_CLEAR(globaldir);
}
@@ -6633,6 +6648,7 @@ changedir_func(
cdscope_T scope)
{
char_u *tofree;
+ char_u *pdir = NULL;
int dir_differs;
int retval = FALSE;
@@ -6648,20 +6664,29 @@ changedir_func(
// ":cd -": Change to previous directory
if (STRCMP(new_dir, "-") == 0)
{
- if (prev_dir == NULL)
+ pdir = get_prevdir(scope);
+ if (pdir == NULL)
{
emsg(_("E186: No previous directory"));
return FALSE;
}
- new_dir = prev_dir;
+ new_dir = pdir;
}
+ // Free the previous directory
+ tofree = get_prevdir(scope);
+
// Save current directory for next ":cd -"
- tofree = prev_dir;
if (mch_dirname(NameBuff, MAXPATHL) == OK)
- prev_dir = vim_strsave(NameBuff);
+ 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 = NULL;
+ prev_dir = pdir;
#if defined(UNIX) || defined(VMS)
// for UNIX ":cd" means: go to home directory
@@ -6682,8 +6707,8 @@ changedir_func(
new_dir = NameBuff;
}
#endif
- dir_differs = new_dir == NULL || prev_dir == NULL
- || pathcmp((char *)prev_dir, (char *)new_dir, -1) != 0;
+ 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));
else