changeset 26173:460790b520dd v8.2.3618

patch 8.2.3618: getcwd() is unclear about how 'autochdir' is used Commit: https://github.com/vim/vim/commit/851c7a699ae00bdc14a4db874cf722b7b7393b53 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Nov 18 20:47:31 2021 +0000 patch 8.2.3618: getcwd() is unclear about how 'autochdir' is used Problem: getcwd() is unclear about how 'autochdir' is used. Solution: Update the help for getcwd(). Without any arguments always return the actual current directory. (closes #9142)
author Bram Moolenaar <Bram@vim.org>
date Thu, 18 Nov 2021 22:00:06 +0100
parents b35f5fdc951b
children 00e8f1ac9c6d
files runtime/doc/eval.txt src/filepath.c src/testdir/test_cd.vim src/version.c
diffstat 4 files changed, 29 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -5757,7 +5757,7 @@ getcursorcharpos([{winid}])
 <							*getcwd()*
 getcwd([{winnr} [, {tabnr}]])
 		The result is a String, which is the name of the current
-		working directory.
+		working directory.  'autochdir' is ignored.
 
 		With {winnr} return the local current directory of this window
 		in the current tab page.  {winnr} can be the window number or
@@ -5770,8 +5770,8 @@ getcwd([{winnr} [, {tabnr}]])
 		the working directory of the tabpage.
 		If {winnr} is zero use the current window, if {tabnr} is zero
 		use the current tabpage.
-		Without any arguments, return the working directory of the
-		current window.
+		Without any arguments, return the actual working directory of
+		the current window.
 		Return an empty string if the arguments are invalid.
 
 		Examples: >
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -1102,13 +1102,15 @@ f_getcwd(typval_T *argvars, typval_T *re
     else
 	wp = find_tabwin(&argvars[0], &argvars[1], &tp);
 
-    if (wp != NULL && wp->w_localdir != NULL)
+    if (wp != NULL && wp->w_localdir != NULL
+					   && argvars[0].v_type != VAR_UNKNOWN)
 	rettv->vval.v_string = vim_strsave(wp->w_localdir);
-    else if (tp != NULL && tp->tp_localdir != NULL)
+    else if (tp != NULL && tp->tp_localdir != NULL
+					   && argvars[0].v_type != VAR_UNKNOWN)
 	rettv->vval.v_string = vim_strsave(tp->tp_localdir);
     else if (wp != NULL || tp != NULL || global)
     {
-	if (globaldir != NULL)
+	if (globaldir != NULL && argvars[0].v_type != VAR_UNKNOWN)
 	    rettv->vval.v_string = vim_strsave(globaldir);
 	else
 	{
--- a/src/testdir/test_cd.vim
+++ b/src/testdir/test_cd.vim
@@ -225,4 +225,23 @@ func Test_cd_unknown_dir()
   call delete('Xa', 'rf')
 endfunc
 
+func Test_getcwd_actual_dir()
+  let startdir = getcwd()
+  call mkdir('Xactual')
+  call test_autochdir()
+  set autochdir
+  edit Xactual/file.txt
+  call assert_match('testdir.Xactual$', getcwd())
+  lcd ..
+  call assert_match('testdir$', getcwd())
+  edit
+  call assert_match('testdir.Xactual$', getcwd())
+  call assert_match('testdir$', getcwd(win_getid()))
+
+  set noautochdir
+  bwipe!
+  call chdir(startdir)
+  call delete('Xactual', 'rf')
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3618,
+/**/
     3617,
 /**/
     3616,