]> granicus.if.org Git - vim/commitdiff
patch 8.0.1489: there is no easy way to get the global directory v8.0.1489
authorBram Moolenaar <Bram@vim.org>
Fri, 9 Feb 2018 19:53:59 +0000 (20:53 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 9 Feb 2018 19:53:59 +0000 (20:53 +0100)
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)

runtime/doc/eval.txt
src/evalfunc.c
src/testdir/test_getcwd.vim
src/version.c

index be24e753864fdabd06d03021e9e504b101803517..648e4e8c5a3b83381e2e064d530cec39cb286434 100644 (file)
@@ -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()*
index a19f706b2591442967f10f0fa1327ab9321ac521..632b982de080b66c3093c14db391849eab689e75 100644 (file)
@@ -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
        {
index 15eab2abbb487bfbc07fc5ba074b06714c85b52b..334b890772388afa22eb082b2342b37975375097 100644 (file)
@@ -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
index eb0c02a1e8a1c9accd2d42fe77856518a222617d..ccc10668ae76d08a393ca73d8d4fa59dc0951769 100644 (file)
@@ -771,6 +771,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1489,
 /**/
     1488,
 /**/