changeset 9469:38e2fc4ee4ef v7.4.2015

commit https://github.com/vim/vim/commit/5c71994f4ee5f87d4cce990dbc9684c70b1e108b Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jul 9 23:40:45 2016 +0200 patch 7.4.2015 Problem: When a file gets a name when writing it 'acd' is not effective. (Dan Church) Solution: Invoke DO_AUTOCHDIR after writing the file. (Allen Haim, closes #777, closes #803) Add test_autochdir() to enable 'acd' before "starting" is reset.
author Christian Brabandt <cb@256bit.org>
date Sat, 09 Jul 2016 23:45:05 +0200
parents 7070daf57525
children 9347c9350291
files src/Makefile src/buffer.c src/eval.c src/ex_cmds.c src/globals.h src/testdir/Make_all.mak src/testdir/test_autochdir.vim src/version.c
diffstat 8 files changed, 48 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/Makefile
+++ b/src/Makefile
@@ -2016,6 +2016,7 @@ test1 \
 test_arglist \
 	test_assert \
 	test_assign \
+	test_autochdir \
 	test_autocmd \
 	test_backspace_opt \
 	test_cdo \
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1635,7 +1635,7 @@ enter_buffer(buf_T *buf)
     void
 do_autochdir(void)
 {
-    if (starting == 0
+    if ((starting == 0 || test_autochdir)
 	    && curbuf->b_ffname != NULL
 	    && vim_chdirfile(curbuf->b_ffname) == OK)
 	shorten_fnames(TRUE);
--- a/src/eval.c
+++ b/src/eval.c
@@ -812,6 +812,7 @@ static void f_taglist(typval_T *argvars,
 static void f_tagfiles(typval_T *argvars, typval_T *rettv);
 static void f_tempname(typval_T *argvars, typval_T *rettv);
 static void f_test_alloc_fail(typval_T *argvars, typval_T *rettv);
+static void f_test_autochdir(typval_T *argvars, typval_T *rettv);
 static void f_test_disable_char_avail(typval_T *argvars, typval_T *rettv);
 static void f_test_garbagecollect_now(typval_T *argvars, typval_T *rettv);
 #ifdef FEAT_JOB_CHANNEL
@@ -8832,6 +8833,7 @@ static struct fst
 #endif
     {"tempname",	0, 0, f_tempname},
     {"test_alloc_fail",	3, 3, f_test_alloc_fail},
+    {"test_autochdir",	0, 0, f_test_autochdir},
     {"test_disable_char_avail", 1, 1, f_test_disable_char_avail},
     {"test_garbagecollect_now",	0, 0, f_test_garbagecollect_now},
 #ifdef FEAT_JOB_CHANNEL
@@ -13155,7 +13157,7 @@ f_getcwd(typval_T *argvars, typval_T *re
     {
 	if (wp->w_localdir != NULL)
 	    rettv->vval.v_string = vim_strsave(wp->w_localdir);
-	else if(globaldir != NULL)
+	else if (globaldir != NULL)
 	    rettv->vval.v_string = vim_strsave(globaldir);
 	else
 	{
@@ -21077,6 +21079,17 @@ f_test_alloc_fail(typval_T *argvars, typ
 }
 
 /*
+ * "test_autochdir()"
+ */
+    static void
+f_test_autochdir(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+{
+#if defined(FEAT_AUTOCHDIR)
+    test_autochdir = TRUE;
+#endif
+}
+
+/*
  * "test_disable_char_avail({expr})" function
  */
     static void
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3059,6 +3059,7 @@ do_write(exarg_T *eap)
     char_u	*browse_file = NULL;
 #endif
     buf_T	*alt_buf = NULL;
+    int		name_was_missing;
 
     if (not_writing())		/* check 'write' option */
 	return FAIL;
@@ -3226,6 +3227,8 @@ do_write(exarg_T *eap)
 #endif
 	}
 
+	name_was_missing = curbuf->b_ffname == NULL;
+
 	retval = buf_write(curbuf, ffname, fname, eap->line1, eap->line2,
 				 eap, eap->append, eap->forceit, TRUE, FALSE);
 
@@ -3239,7 +3242,12 @@ do_write(exarg_T *eap)
 		redraw_tabline = TRUE;
 #endif
 	    }
-	    /* Change directories when the 'acd' option is set. */
+	}
+
+	/* Change directories when the 'acd' option is set and the file name
+	 * got changed or set. */
+	if (eap->cmdidx == CMD_saveas || name_was_missing)
+	{
 	    DO_AUTOCHDIR
 	}
     }
--- a/src/globals.h
+++ b/src/globals.h
@@ -635,6 +635,9 @@ EXTERN int	exiting INIT(= FALSE);
 EXTERN int	really_exiting INIT(= FALSE);
 				/* TRUE when we are sure to exit, e.g., after
 				 * a deadly signal */
+#if defined(FEAT_AUTOCHDIR)
+EXTERN int	test_autochdir INIT(= FALSE);
+#endif
 #if defined(EXITFREE)
 EXTERN int	entered_free_all_mem INIT(= FALSE);
 				/* TRUE when in or after free_all_mem() */
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -164,6 +164,7 @@ SCRIPTS_GUI = test16.out
 # Keep test_alot*.res as the last one, sort the others.
 NEW_TESTS = test_arglist.res \
 	    test_assert.res \
+	    test_autochdir \
 	    test_backspace_opt.res \
 	    test_cdo.res \
 	    test_channel.res \
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_autochdir.vim
@@ -0,0 +1,17 @@
+" Test 'autochdir' behavior
+
+if !exists("+autochdir")
+  finish
+endif
+
+func Test_set_filename()
+  call test_autochdir()
+  set acd
+  new
+  w samples/Xtest
+  call assert_equal("Xtest", expand('%'))
+  call assert_equal("samples", substitute(getcwd(), '.*/\(\k*\)', '\1', ''))
+  bwipe!
+  set noacd
+  call delete('samples/Xtest')
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -759,6 +759,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2015,
+/**/
     2014,
 /**/
     2013,