To: vim_dev@googlegroups.com Subject: Patch 8.1.0602 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0602 Problem: DirChanged is also triggered when the directory didn't change. (Daniel Hahler) Solution: Compare the current with the new directory. (closes #3697) Files: src/ex_docmd.c, src/testdir/test_autocmd.vim, src/misc2.c, src/testdir/test_autochdir.vim *** ../vim-8.1.0601/src/ex_docmd.c 2018-12-14 18:52:57.165528788 +0100 --- src/ex_docmd.c 2018-12-16 15:29:11.614092524 +0100 *************** *** 9126,9133 **** void ex_cd(exarg_T *eap) { ! char_u *new_dir; ! char_u *tofree; new_dir = eap->arg; #if !defined(UNIX) && !defined(VMS) --- 9126,9134 ---- void ex_cd(exarg_T *eap) { ! char_u *new_dir; ! char_u *tofree; ! int dir_differs; new_dir = eap->arg; #if !defined(UNIX) && !defined(VMS) *************** *** 9183,9189 **** new_dir = NameBuff; } #endif ! if (new_dir == NULL || vim_chdir(new_dir)) EMSG(_(e_failed)); else { --- 9184,9192 ---- new_dir = NameBuff; } #endif ! 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,9203 **** /* 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); } vim_free(tofree); } --- 9198,9208 ---- /* Echo the new current directory if the command was typed. */ if (KeyTyped || p_verbose >= 5) ex_pwd(eap); ! ! if (dir_differs) ! apply_autocmds(EVENT_DIRCHANGED, ! is_local_chdir ? (char_u *)"window" : (char_u *)"global", ! new_dir, FALSE, curbuf); } vim_free(tofree); } *** ../vim-8.1.0601/src/testdir/test_autocmd.vim 2018-08-08 22:08:28.326846653 +0200 --- src/testdir/test_autocmd.vim 2018-12-16 15:06:01.850719909 +0100 *************** *** 1205,1217 **** augroup END let s:li = [] let s:dir_this = getcwd() ! let s:dir_other = s:dir_this . '/foo' ! call mkdir(s:dir_other) endfunc function s:After_test_dirchanged() exe 'cd' s:dir_this ! call delete(s:dir_other, 'd') augroup test_dirchanged autocmd! augroup END --- 1205,1220 ---- augroup END let s:li = [] let s:dir_this = getcwd() ! 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_foo, 'd') ! call delete(s:dir_bar, 'd') augroup test_dirchanged autocmd! augroup END *************** *** 1221,1230 **** 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("")) ! 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) call s:After_test_dirchanged() endfunc --- 1224,1235 ---- 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("")) ! 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,1241 **** 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("")) ! exe 'cd' s:dir_other call assert_equal([], s:li) ! exe 'lcd' s:dir_other ! call assert_equal(["lcd:", s:dir_other], s:li) call s:After_test_dirchanged() endfunc --- 1237,1248 ---- 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("")) ! exe 'cd' s:dir_foo call assert_equal([], 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,1258 **** 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) set noacd bwipe! call s:After_test_dirchanged() --- 1257,1265 ---- set acd exe 'cd ..' call assert_equal([], 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() *** ../vim-8.1.0601/src/misc2.c 2018-12-14 21:31:58.012319694 +0100 --- src/misc2.c 2018-12-16 15:12:14.376386072 +0100 *************** *** 3390,3406 **** * Return OK or FAIL. */ int ! vim_chdirfile(char_u *fname, char *trigger_autocmd UNUSED) { ! char_u 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); return res; } #endif --- 3390,3418 ---- * Return OK or FAIL. */ int ! vim_chdirfile(char_u *fname, char *trigger_autocmd) { ! char_u old_dir[MAXPATHL]; ! char_u new_dir[MAXPATHL]; int res; ! 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 *** ../vim-8.1.0601/src/testdir/test_autochdir.vim 2017-10-27 00:47:53.000000000 +0200 --- src/testdir/test_autochdir.vim 2018-12-16 15:21:27.396965776 +0100 *************** *** 8,18 **** --- 8,26 ---- 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("")) + 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') *** ../vim-8.1.0601/src/version.c 2018-12-16 14:37:35.845271247 +0100 --- src/version.c 2018-12-16 15:37:07.343129132 +0100 *************** *** 801,802 **** --- 801,804 ---- { /* Add new patch number below this line */ + /**/ + 602, /**/ -- hundred-and-one symptoms of being an internet addict: 26. You check your mail. It says "no new messages." So you check it again. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///