summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-07-09 23:40:45 +0200
committerBram Moolenaar <Bram@vim.org>2016-07-09 23:40:45 +0200
commit5c71994f4ee5f87d4cce990dbc9684c70b1e108b (patch)
tree54d709f577451315f508421842acd40c5d8776f1
parent32b808a4bdf35b0dea63c735702a591e5869fecd (diff)
patch 7.4.2015v7.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.
-rw-r--r--src/Makefile1
-rw-r--r--src/buffer.c2
-rw-r--r--src/eval.c15
-rw-r--r--src/ex_cmds.c10
-rw-r--r--src/globals.h3
-rw-r--r--src/testdir/Make_all.mak1
-rw-r--r--src/testdir/test_autochdir.vim17
-rw-r--r--src/version.c2
8 files changed, 48 insertions, 3 deletions
diff --git a/src/Makefile b/src/Makefile
index 007c7925db..24aa9ca293 100644
--- 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 \
diff --git a/src/buffer.c b/src/buffer.c
index 7c69b8e9d7..b434d58e90 100644
--- 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);
diff --git a/src/eval.c b/src/eval.c
index 6e15a55df6..8b67604471 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -812,6 +812,7 @@ static void f_taglist(typval_T *argvars, typval_T *rettv);
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 *rettv)
{
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, typval_T *rettv UNUSED)
}
/*
+ * "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
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 5900c86d31..d93a7ec7fc 100644
--- 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
}
}
diff --git a/src/globals.h b/src/globals.h
index 68bf36f582..879255cd57 100644
--- 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() */
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 88efd19e91..dabf573140 100644
--- 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 \
diff --git a/src/testdir/test_autochdir.vim b/src/testdir/test_autochdir.vim
new file mode 100644
index 0000000000..f52e2e668a
--- /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
diff --git a/src/version.c b/src/version.c
index 86c8c066e3..b2dc76ec3d 100644
--- 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,