changeset 13229:93efa1de7abb v8.0.1489

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 <Bram@vim.org> 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)
author Christian Brabandt <cb@256bit.org>
date Fri, 09 Feb 2018 21:00:06 +0100
parents 8ece1b2f3081
children 0b201ae05cd3
files runtime/doc/eval.txt src/evalfunc.c src/testdir/test_getcwd.vim src/version.c
diffstat 4 files changed, 27 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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()*
--- 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
 	{
--- 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
--- 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,