diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-02-09 20:53:59 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-02-09 20:53:59 +0100 |
commit | 5459129af2a832a027a1e7ca2d6177c26647d64f (patch) | |
tree | e001cd02a219302d36cb41ede9fe4c72bdbb9718 | |
parent | 0d2073773218736e368786f0db7024bd9b9e7912 (diff) | |
download | vim-git-5459129af2a832a027a1e7ca2d6177c26647d64f.tar.gz |
patch 8.0.1489: there is no easy way to get the global directoryv8.0.1489
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)
-rw-r--r-- | runtime/doc/eval.txt | 7 | ||||
-rw-r--r-- | src/evalfunc.c | 15 | ||||
-rw-r--r-- | src/testdir/test_getcwd.vim | 9 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 26 insertions, 7 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index be24e7538..648e4e8c5 100644 --- 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 index a19f706b2..632b982de 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -4613,16 +4613,21 @@ f_getcwd(typval_T *argvars, typval_T *rettv) { 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 (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 (wp->w_localdir != NULL) - rettv->vval.v_string = vim_strsave(wp->w_localdir); - else if (globaldir != NULL) + 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 index 15eab2abb..334b89077 100644 --- 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 index eb0c02a1e..ccc10668a 100644 --- 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, |