# HG changeset patch # User Christian Brabandt # Date 1518206406 -3600 # Node ID 93efa1de7abb764ac30c3b18df062828f86996db # Parent 8ece1b2f308162cb26adc84ce41c3ceae1546391 patch 8.0.1489: there is no easy way to get the global directory commit https://github.com/vim/vim/commit/5459129af2a832a027a1e7ca2d6177c26647d64f Author: Bram Moolenaar Date: Fri Feb 9 20:53:59 2018 +0100 patch 8.0.1489: there is no easy way to get the global directory Problem: There is no easy way to get the global directory, esp. if some windows have a local directory. Solution: Make getcwd(-1) return the global directory. (Andy Massimino, closes #2606) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -4484,10 +4484,13 @@ getcwd([{winnr} [, {tabnr}]]) Without arguments, for the current window. With {winnr} return the local current directory of this window - in the current tab page. + in the current tab page. {winnr} can be the window number or + the |window-ID|. + If {winnr} is -1 return the name of the global working + directory. See also |haslocaldir()|. + With {winnr} and {tabnr} return the local current directory of the window in the specified tab page. - {winnr} can be the window number or the |window-ID|. Return an empty string if the arguments are invalid. getfsize({fname}) *getfsize()* diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -4613,16 +4613,21 @@ f_getcwd(typval_T *argvars, typval_T *re { win_T *wp = NULL; char_u *cwd; + int global = FALSE; rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; - wp = find_tabwin(&argvars[0], &argvars[1]); - if (wp != NULL) - { - if (wp->w_localdir != NULL) - rettv->vval.v_string = vim_strsave(wp->w_localdir); - else if (globaldir != NULL) + if (argvars[0].v_type == VAR_NUMBER && argvars[0].vval.v_number == -1) + global = TRUE; + else + wp = find_tabwin(&argvars[0], &argvars[1]); + + if (wp != NULL && wp->w_localdir != NULL) + rettv->vval.v_string = vim_strsave(wp->w_localdir); + else if (wp != NULL || global) + { + if (globaldir != NULL) rettv->vval.v_string = vim_strsave(globaldir); else { diff --git a/src/testdir/test_getcwd.vim b/src/testdir/test_getcwd.vim --- a/src/testdir/test_getcwd.vim +++ b/src/testdir/test_getcwd.vim @@ -37,6 +37,7 @@ function SetUp() new call mkdir('Xtopdir') cd Xtopdir + let g:topdir = getcwd() call mkdir('Xdir1') call mkdir('Xdir2') call mkdir('Xdir3') @@ -56,36 +57,44 @@ function Test_GetCwd() 3wincmd w lcd Xdir1 call assert_equal("a Xdir1 1", GetCwdInfo(0, 0)) + call assert_equal(g:topdir, getcwd(-1)) wincmd W call assert_equal("b Xtopdir 0", GetCwdInfo(0, 0)) + call assert_equal(g:topdir, getcwd(-1)) wincmd W lcd Xdir3 call assert_equal("c Xdir3 1", GetCwdInfo(0, 0)) call assert_equal("a Xdir1 1", GetCwdInfo(bufwinnr("a"), 0)) call assert_equal("b Xtopdir 0", GetCwdInfo(bufwinnr("b"), 0)) call assert_equal("c Xdir3 1", GetCwdInfo(bufwinnr("c"), 0)) + call assert_equal(g:topdir, getcwd(-1)) wincmd W call assert_equal("a Xdir1 1", GetCwdInfo(bufwinnr("a"), tabpagenr())) call assert_equal("b Xtopdir 0", GetCwdInfo(bufwinnr("b"), tabpagenr())) call assert_equal("c Xdir3 1", GetCwdInfo(bufwinnr("c"), tabpagenr())) + call assert_equal(g:topdir, getcwd(-1)) tabnew x new y new z 3wincmd w call assert_equal("x Xtopdir 0", GetCwdInfo(0, 0)) + call assert_equal(g:topdir, getcwd(-1)) wincmd W lcd Xdir2 call assert_equal("y Xdir2 1", GetCwdInfo(0, 0)) + call assert_equal(g:topdir, getcwd(-1)) wincmd W lcd Xdir3 call assert_equal("z Xdir3 1", GetCwdInfo(0, 0)) call assert_equal("x Xtopdir 0", GetCwdInfo(bufwinnr("x"), 0)) call assert_equal("y Xdir2 1", GetCwdInfo(bufwinnr("y"), 0)) call assert_equal("z Xdir3 1", GetCwdInfo(bufwinnr("z"), 0)) + call assert_equal(g:topdir, getcwd(-1)) let tp_nr = tabpagenr() tabrewind call assert_equal("x Xtopdir 0", GetCwdInfo(3, tp_nr)) call assert_equal("y Xdir2 1", GetCwdInfo(2, tp_nr)) call assert_equal("z Xdir3 1", GetCwdInfo(1, tp_nr)) + call assert_equal(g:topdir, getcwd(-1)) endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -772,6 +772,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1489, +/**/ 1488, /**/ 1487,