summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-02-09 20:53:59 +0100
committerBram Moolenaar <Bram@vim.org>2018-02-09 20:53:59 +0100
commit5459129af2a832a027a1e7ca2d6177c26647d64f (patch)
treee001cd02a219302d36cb41ede9fe4c72bdbb9718
parent0d2073773218736e368786f0db7024bd9b9e7912 (diff)
downloadvim-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.txt7
-rw-r--r--src/evalfunc.c15
-rw-r--r--src/testdir/test_getcwd.vim9
-rw-r--r--src/version.c2
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,