diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-06-05 22:33:42 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-06-05 22:33:42 +0200 |
commit | 002bc79991286934a9593b80635c27d4238cdfc4 (patch) | |
tree | 777b6a2574f8dfe4ac76552a0a8e44ba005e7961 /src/ex_docmd.c | |
parent | 3fffa97159a427067b60c80ed4645e168cc5c4bd (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.c | 51 |
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 |