diff options
-rw-r--r-- | src/ex_docmd.c | 17 | ||||
-rw-r--r-- | src/misc2.c | 28 | ||||
-rw-r--r-- | src/testdir/test_autochdir.vim | 8 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 33 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 61 insertions, 27 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c index c738d0798..e700f2ed4 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -9126,8 +9126,9 @@ post_chdir(int local) void ex_cd(exarg_T *eap) { - char_u *new_dir; - char_u *tofree; + char_u *new_dir; + char_u *tofree; + int dir_differs; new_dir = eap->arg; #if !defined(UNIX) && !defined(VMS) @@ -9183,7 +9184,9 @@ ex_cd(exarg_T *eap) new_dir = NameBuff; } #endif - if (new_dir == NULL || vim_chdir(new_dir)) + dir_differs = new_dir == NULL || prev_dir == NULL + || STRCMP(prev_dir, new_dir) != 0; + if (new_dir == NULL || (dir_differs && vim_chdir(new_dir))) EMSG(_(e_failed)); else { @@ -9195,9 +9198,11 @@ ex_cd(exarg_T *eap) /* Echo the new current directory if the command was typed. */ if (KeyTyped || p_verbose >= 5) ex_pwd(eap); - apply_autocmds(EVENT_DIRCHANGED, - is_local_chdir ? (char_u *)"window" : (char_u *)"global", - new_dir, FALSE, curbuf); + + if (dir_differs) + apply_autocmds(EVENT_DIRCHANGED, + is_local_chdir ? (char_u *)"window" : (char_u *)"global", + new_dir, FALSE, curbuf); } vim_free(tofree); } diff --git a/src/misc2.c b/src/misc2.c index fbf8a08af..4e3b845f7 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -3390,17 +3390,29 @@ same_directory(char_u *f1, char_u *f2) * Return OK or FAIL. */ int -vim_chdirfile(char_u *fname, char *trigger_autocmd UNUSED) +vim_chdirfile(char_u *fname, char *trigger_autocmd) { - char_u dir[MAXPATHL]; + char_u old_dir[MAXPATHL]; + char_u new_dir[MAXPATHL]; int res; - vim_strncpy(dir, fname, MAXPATHL - 1); - *gettail_sep(dir) = NUL; - res = mch_chdir((char *)dir) == 0 ? OK : FAIL; - if (res == OK && trigger_autocmd != NULL) - apply_autocmds(EVENT_DIRCHANGED, (char_u *)trigger_autocmd, - dir, FALSE, curbuf); + if (mch_dirname(old_dir, MAXPATHL) != OK) + *old_dir = NUL; + + vim_strncpy(new_dir, fname, MAXPATHL - 1); + *gettail_sep(new_dir) = NUL; + + if (STRCMP(old_dir, new_dir) == 0) + // nothing to do + res = OK; + else + { + res = mch_chdir((char *)new_dir) == 0 ? OK : FAIL; + + if (res == OK && trigger_autocmd != NULL) + apply_autocmds(EVENT_DIRCHANGED, (char_u *)trigger_autocmd, + new_dir, FALSE, curbuf); + } return res; } #endif diff --git a/src/testdir/test_autochdir.vim b/src/testdir/test_autochdir.vim index 05d69631c..90538fbc0 100644 --- a/src/testdir/test_autochdir.vim +++ b/src/testdir/test_autochdir.vim @@ -8,11 +8,19 @@ func Test_set_filename() let cwd = getcwd() call test_autochdir() set acd + + let s:li = [] + autocmd DirChanged auto call add(s:li, "autocd") + autocmd DirChanged auto call add(s:li, expand("<afile>")) + new w samples/Xtest call assert_equal("Xtest", expand('%')) call assert_equal("samples", substitute(getcwd(), '.*/\(\k*\)', '\1', '')) + call assert_equal(["autocd", getcwd()], s:li) + bwipe! + au! DirChanged set noacd exe 'cd ' . cwd call delete('samples/Xtest') diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 3d650e473..b05b210c2 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -1205,13 +1205,16 @@ function s:Before_test_dirchanged() augroup END let s:li = [] let s:dir_this = getcwd() - let s:dir_other = s:dir_this . '/foo' - call mkdir(s:dir_other) + let s:dir_foo = s:dir_this . '/foo' + call mkdir(s:dir_foo) + let s:dir_bar = s:dir_this . '/bar' + call mkdir(s:dir_bar) endfunc function s:After_test_dirchanged() exe 'cd' s:dir_this - call delete(s:dir_other, 'd') + call delete(s:dir_foo, 'd') + call delete(s:dir_bar, 'd') augroup test_dirchanged autocmd! augroup END @@ -1221,10 +1224,12 @@ function Test_dirchanged_global() call s:Before_test_dirchanged() autocmd test_dirchanged DirChanged global call add(s:li, "cd:") autocmd test_dirchanged DirChanged global call add(s:li, expand("<afile>")) - exe 'cd' s:dir_other - call assert_equal(["cd:", s:dir_other], s:li) - exe 'lcd' s:dir_other - call assert_equal(["cd:", s:dir_other], s:li) + exe 'cd' s:dir_foo + call assert_equal(["cd:", s:dir_foo], s:li) + exe 'cd' s:dir_foo + call assert_equal(["cd:", s:dir_foo], s:li) + exe 'lcd' s:dir_bar + call assert_equal(["cd:", s:dir_foo], s:li) call s:After_test_dirchanged() endfunc @@ -1232,10 +1237,12 @@ function Test_dirchanged_local() call s:Before_test_dirchanged() autocmd test_dirchanged DirChanged window call add(s:li, "lcd:") autocmd test_dirchanged DirChanged window call add(s:li, expand("<afile>")) - exe 'cd' s:dir_other + exe 'cd' s:dir_foo call assert_equal([], s:li) - exe 'lcd' s:dir_other - call assert_equal(["lcd:", s:dir_other], s:li) + exe 'lcd' s:dir_bar + call assert_equal(["lcd:", s:dir_bar], s:li) + exe 'lcd' s:dir_bar + call assert_equal(["lcd:", s:dir_bar], s:li) call s:After_test_dirchanged() endfunc @@ -1250,9 +1257,9 @@ function Test_dirchanged_auto() set acd exe 'cd ..' call assert_equal([], s:li) - exe 'edit ' . s:dir_other . '/Xfile' - call assert_equal(s:dir_other, getcwd()) - call assert_equal(["auto:", s:dir_other], s:li) + exe 'edit ' . s:dir_foo . '/Xfile' + call assert_equal(s:dir_foo, getcwd()) + call assert_equal(["auto:", s:dir_foo], s:li) set noacd bwipe! call s:After_test_dirchanged() diff --git a/src/version.c b/src/version.c index 5db100152..f9154cd03 100644 --- a/src/version.c +++ b/src/version.c @@ -800,6 +800,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 602, +/**/ 601, /**/ 600, |