# HG changeset patch # User Bram Moolenaar # Date 1428065809 -7200 # Node ID 7d40186f767a68cb5b7cc47b05745efe96b080e4 # Parent f7b237bd6606bb2b21ea36bc94ff59e74e48296e updated for version 7.4.689 Problem: On MS-Windows, when 'autochdir' is set, diff mode with files in different directories does not work. (Axel Bender) Solution: Remember the current directory and use it where needed. (Christian Brabandt) diff --git a/src/main.c b/src/main.c --- a/src/main.c +++ b/src/main.c @@ -110,7 +110,7 @@ static void check_tty __ARGS((mparm_T *p static void read_stdin __ARGS((void)); static void create_windows __ARGS((mparm_T *parmp)); # ifdef FEAT_WINDOWS -static void edit_buffers __ARGS((mparm_T *parmp)); +static void edit_buffers __ARGS((mparm_T *parmp, char_u *cwd)); # endif static void exe_pre_commands __ARGS((mparm_T *parmp)); static void exe_commands __ARGS((mparm_T *parmp)); @@ -168,6 +168,7 @@ main char_u *fname = NULL; /* file name from command line */ mparm_T params; /* various parameters passed between * main() and other functions. */ + char_u *cwd = NULL; /* current workding dir on startup */ #ifdef STARTUPTIME int i; #endif @@ -404,12 +405,17 @@ main */ if (!params.literal) { + cwd = alloc(MAXPATHL); + if (cwd != NULL) + mch_dirname(cwd, MAXPATHL); /* Temporarily add '(' and ')' to 'isfname'. These are valid * filename characters but are excluded from 'isfname' to make * "gf" work on a file name in parenthesis (e.g.: see vim.h). */ do_cmdline_cmd((char_u *)":set isf+=(,)"); alist_expand(NULL, 0); do_cmdline_cmd((char_u *)":set isf&"); + if (cwd != NULL) + mch_chdir((char *)cwd); } #endif fname = alist_name(&GARGLIST[0]); @@ -435,6 +441,8 @@ main * If the cd fails, it doesn't matter. */ (void)vim_chdirfile(fname); + if (cwd != NULL) + mch_dirnamem(cwd, MAXPATHL); } #endif TIME_MSG("expanding arguments"); @@ -488,6 +496,8 @@ main expand_env((char_u *)"$HOME", NameBuff, MAXPATHL); vim_chdir(NameBuff); } + if (cwd != NULL) + mch_dirname(cwd, MAXPATHL); } } #endif @@ -900,8 +910,9 @@ vim_main2(int argc UNUSED, char **argv U * If opened more than one window, start editing files in the other * windows. */ - edit_buffers(¶ms); + edit_buffers(¶ms, cwd); #endif + vim_free(cwd); #ifdef FEAT_DIFF if (params.diff_mode) @@ -2730,8 +2741,9 @@ create_windows(parmp) * windows. make_windows() has already opened the windows. */ static void -edit_buffers(parmp) +edit_buffers(parmp, cwd) mparm_T *parmp; + char_u *cwd; /* current working dir */ { int arg_idx; /* index in argument list */ int i; @@ -2756,6 +2768,8 @@ edit_buffers(parmp) arg_idx = 1; for (i = 1; i < parmp->window_count; ++i) { + if (cwd != NULL) + mch_chdir((char *)cwd); /* When w_arg_idx is -1 remove the window (see create_windows()). */ if (curwin->w_arg_idx == -1) { diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 689, +/**/ 688, /**/ 687,