diff --git a/7.4.672 b/7.4.672
new file mode 100644
index 0000000..579b6ef
--- /dev/null
+++ b/7.4.672
@@ -0,0 +1,443 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 7.4.672
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.4.672
+Problem:    When completing a shell command, directories in the current
+	    directory are not listed.
+Solution:   When "." is not in $PATH also look in the current directory for
+	    directories.
+Files:	    src/ex_getln.c, src/vim.h, src/misc1.c, src/eval.c,
+	    src/os_amiga.c, src/os_msdos.c, src/os_unix.c, src/os_vms.c,
+	    src/proto/os_amiga.pro, src/proto/os_msdos.pro,
+	    src/proto/os_unix.pro, src/proto/os_win32.pro
+
+
+*** ../vim-7.4.671/src/ex_getln.c	2015-03-05 19:35:20.690114997 +0100
+--- src/ex_getln.c	2015-03-21 16:18:22.392988057 +0100
+***************
+*** 4885,4890 ****
+--- 4885,4891 ----
+      char_u	*s, *e;
+      int		flags = flagsarg;
+      int		ret;
++     int		did_curdir = FALSE;
+  
+      if (buf == NULL)
+  	return FAIL;
+***************
+*** 4896,4902 ****
+  	if (pat[i] == '\\' && pat[i + 1] == ' ')
+  	    STRMOVE(pat + i, pat + i + 1);
+  
+!     flags |= EW_FILE | EW_EXEC;
+  
+      /* For an absolute name we don't use $PATH. */
+      if (mch_isFullName(pat))
+--- 4897,4903 ----
+  	if (pat[i] == '\\' && pat[i + 1] == ' ')
+  	    STRMOVE(pat + i, pat + i + 1);
+  
+!     flags |= EW_FILE | EW_EXEC | EW_SHELLCMD;
+  
+      /* For an absolute name we don't use $PATH. */
+      if (mch_isFullName(pat))
+***************
+*** 4913,4923 ****
+  
+      /*
+       * Go over all directories in $PATH.  Expand matches in that directory and
+!      * collect them in "ga".
+       */
+      ga_init2(&ga, (int)sizeof(char *), 10);
+!     for (s = path; *s != NUL; s = e)
+      {
+  	if (*s == ' ')
+  	    ++s;	/* Skip space used for absolute path name. */
+  
+--- 4914,4935 ----
+  
+      /*
+       * Go over all directories in $PATH.  Expand matches in that directory and
+!      * collect them in "ga".  When "." is not in $PATH also expand for the
+!      * current directory, to find "subdir/cmd".
+       */
+      ga_init2(&ga, (int)sizeof(char *), 10);
+!     for (s = path; ; s = e)
+      {
++ 	if (*s == NUL)
++ 	{
++ 	    if (did_curdir)
++ 		break;
++ 	    /* Find directories in the current directory, path is empty. */
++ 	    did_curdir = TRUE;
++ 	}
++ 	else if (*s == '.')
++ 	    did_curdir = TRUE;
++ 
+  	if (*s == ' ')
+  	    ++s;	/* Skip space used for absolute path name. */
+  
+*** ../vim-7.4.671/src/vim.h	2015-03-05 19:35:20.686115042 +0100
+--- src/vim.h	2015-03-21 16:19:12.656419663 +0100
+***************
+*** 841,846 ****
+--- 841,848 ----
+  /* Note: mostly EW_NOTFOUND and EW_SILENT are mutually exclusive: EW_NOTFOUND
+   * is used when executing commands and EW_SILENT for interactive expanding. */
+  #define EW_ALLLINKS	0x1000	/* also links not pointing to existing file */
++ #define EW_SHELLCMD	0x2000	/* called from expand_shellcmd(), don't check
++ 				 * if executable is in $PATH */
+  
+  /* Flags for find_file_*() functions. */
+  #define FINDFILE_FILE	0	/* only files */
+*** ../vim-7.4.671/src/misc1.c	2015-03-20 19:06:01.982429823 +0100
+--- src/misc1.c	2015-03-21 17:03:42.218172476 +0100
+***************
+*** 10987,10994 ****
+      if ((isdir && !(flags & EW_DIR)) || (!isdir && !(flags & EW_FILE)))
+  	return;
+  
+!     /* If the file isn't executable, may not add it.  Do accept directories. */
+!     if (!isdir && (flags & EW_EXEC) && !mch_can_exe(f, NULL))
+  	return;
+  
+      /* Make room for another item in the file list. */
+--- 10987,10996 ----
+      if ((isdir && !(flags & EW_DIR)) || (!isdir && !(flags & EW_FILE)))
+  	return;
+  
+!     /* If the file isn't executable, may not add it.  Do accept directories.
+!      * When invoked from expand_shellcmd() do not use $PATH. */
+!     if (!isdir && (flags & EW_EXEC)
+! 			     && !mch_can_exe(f, NULL, !(flags & EW_SHELLCMD)))
+  	return;
+  
+      /* Make room for another item in the file list. */
+*** ../vim-7.4.671/src/eval.c	2015-03-20 17:36:38.618949214 +0100
+--- src/eval.c	2015-03-21 16:53:45.996929428 +0100
+***************
+*** 10271,10277 ****
+      typval_T	*argvars;
+      typval_T	*rettv;
+  {
+!     rettv->vval.v_number = mch_can_exe(get_tv_string(&argvars[0]), NULL);
+  }
+  
+  /*
+--- 10271,10281 ----
+      typval_T	*argvars;
+      typval_T	*rettv;
+  {
+!     char_u *name = get_tv_string(&argvars[0]);
+! 
+!     /* Check in $PATH and also check directly if there is a directory name. */
+!     rettv->vval.v_number = mch_can_exe(name, NULL, TRUE)
+! 		 || (gettail(name) != name && mch_can_exe(name, NULL, FALSE));
+  }
+  
+  /*
+***************
+*** 10284,10290 ****
+  {
+      char_u *p = NULL;
+  
+!     (void)mch_can_exe(get_tv_string(&argvars[0]), &p);
+      rettv->v_type = VAR_STRING;
+      rettv->vval.v_string = p;
+  }
+--- 10288,10294 ----
+  {
+      char_u *p = NULL;
+  
+!     (void)mch_can_exe(get_tv_string(&argvars[0]), &p, TRUE);
+      rettv->v_type = VAR_STRING;
+      rettv->vval.v_string = p;
+  }
+*** ../vim-7.4.671/src/os_amiga.c	2014-04-01 21:00:45.436733663 +0200
+--- src/os_amiga.c	2015-03-21 16:54:49.456210821 +0100
+***************
+*** 881,892 ****
+  
+  /*
+   * Return 1 if "name" can be executed, 0 if not.
+   * Return -1 if unknown.
+   */
+      int
+! mch_can_exe(name, path)
+      char_u	*name;
+      char_u	**path;
+  {
+      /* TODO */
+      return -1;
+--- 881,894 ----
+  
+  /*
+   * Return 1 if "name" can be executed, 0 if not.
++  * If "use_path" is FALSE only check if "name" is executable.
+   * Return -1 if unknown.
+   */
+      int
+! mch_can_exe(name, path, use_path)
+      char_u	*name;
+      char_u	**path;
++     int		use_path;
+  {
+      /* TODO */
+      return -1;
+*** ../vim-7.4.671/src/os_msdos.c	2014-04-01 21:00:45.436733663 +0200
+--- src/os_msdos.c	2015-03-21 16:55:03.048056750 +0100
+***************
+*** 2942,2956 ****
+  
+  /*
+   * Return 1 if "name" can be executed, 0 if not.
+   * Return -1 if unknown.
+   */
+      int
+! mch_can_exe(name, path)
+      char_u	*name;
+      char_u	**path;
+  {
+      char	*p;
+  
+      p = searchpath(name);
+      if (p == NULL || mch_isdir(p))
+  	return FALSE;
+--- 2942,2965 ----
+  
+  /*
+   * Return 1 if "name" can be executed, 0 if not.
++  * If "use_path" is FALSE only check if "name" is executable.
+   * Return -1 if unknown.
+   */
+      int
+! mch_can_exe(name, path, use_path)
+      char_u	*name;
+      char_u	**path;
++     int		use_path;
+  {
+      char	*p;
++     int		mode;
+  
++     if (!use_path)
++     {
++ 	/* TODO: proper check if file is executable. */
++ 	mode = vim_chmod(name);
++ 	return mode != -1 && (mode & FA_DIREC) == 0;
++     }
+      p = searchpath(name);
+      if (p == NULL || mch_isdir(p))
+  	return FALSE;
+*** ../vim-7.4.671/src/os_unix.c	2015-03-20 16:26:48.974173903 +0100
+--- src/os_unix.c	2015-03-21 17:07:43.083443005 +0100
+***************
+*** 3104,3125 ****
+  
+  /*
+   * Return 1 if "name" can be found in $PATH and executed, 0 if not.
+   * Return -1 if unknown.
+   */
+      int
+! mch_can_exe(name, path)
+      char_u	*name;
+      char_u	**path;
+  {
+      char_u	*buf;
+      char_u	*p, *e;
+      int		retval;
+  
+!     /* If it's an absolute or relative path don't need to use $PATH. */
+!     if (mch_isFullName(name) || (name[0] == '.' && (name[1] == '/'
+! 				      || (name[1] == '.' && name[2] == '/'))))
+!     {
+! 	if (executable_file(name))
+  	{
+  	    if (path != NULL)
+  	    {
+--- 3104,3130 ----
+  
+  /*
+   * Return 1 if "name" can be found in $PATH and executed, 0 if not.
++  * If "use_path" is FALSE only check if "name" is executable.
+   * Return -1 if unknown.
+   */
+      int
+! mch_can_exe(name, path, use_path)
+      char_u	*name;
+      char_u	**path;
++     int		use_path;
+  {
+      char_u	*buf;
+      char_u	*p, *e;
+      int		retval;
+  
+!     /* When "use_path" is false and if it's an absolute or relative path don't
+!      * need to use $PATH. */
+!     if (!use_path || mch_isFullName(name) || (name[0] == '.'
+! 		   && (name[1] == '/' || (name[1] == '.' && name[2] == '/'))))
+!     {
+! 	/* There must be a path separator, files in the current directory
+! 	 * can't be executed. */
+! 	if (gettail(name) != name && executable_file(name))
+  	{
+  	    if (path != NULL)
+  	    {
+***************
+*** 5730,5736 ****
+  		    continue;
+  
+  		/* Skip files that are not executable if we check for that. */
+! 		if (!dir && (flags & EW_EXEC) && !mch_can_exe(p, NULL))
+  		    continue;
+  
+  		if (--files_free == 0)
+--- 5735,5742 ----
+  		    continue;
+  
+  		/* Skip files that are not executable if we check for that. */
+! 		if (!dir && (flags & EW_EXEC)
+! 			     && !mch_can_exe(p, NULL, !(flags & EW_SHELLCMD)))
+  		    continue;
+  
+  		if (--files_free == 0)
+***************
+*** 6230,6236 ****
+  	    continue;
+  
+  	/* Skip files that are not executable if we check for that. */
+! 	if (!dir && (flags & EW_EXEC) && !mch_can_exe((*file)[i], NULL))
+  	    continue;
+  
+  	p = alloc((unsigned)(STRLEN((*file)[i]) + 1 + dir));
+--- 6236,6243 ----
+  	    continue;
+  
+  	/* Skip files that are not executable if we check for that. */
+! 	if (!dir && (flags & EW_EXEC)
+! 		    && !mch_can_exe((*file)[i], NULL, !(flags & EW_SHELLCMD)))
+  	    continue;
+  
+  	p = alloc((unsigned)(STRLEN((*file)[i]) + 1 + dir));
+*** ../vim-7.4.671/src/os_vms.c	2014-11-12 16:10:44.258085148 +0100
+--- src/os_vms.c	2015-03-21 16:43:28.283924831 +0100
+***************
+*** 483,489 ****
+  		continue;
+  
+  	    /* Skip files that are not executable if we check for that. */
+! 	    if (!dir && (flags & EW_EXEC) && !mch_can_exe(vms_fmatch[i], NULL))
+  		continue;
+  
+  	    /* allocate memory for pointers */
+--- 483,490 ----
+  		continue;
+  
+  	    /* Skip files that are not executable if we check for that. */
+! 	    if (!dir && (flags & EW_EXEC)
+! 		 && !mch_can_exe(vms_fmatch[i], NULL, !(flags & EW_SHELLCMD)))
+  		continue;
+  
+  	    /* allocate memory for pointers */
+*** ../vim-7.4.671/src/proto/os_amiga.pro	2014-04-01 21:00:45.436733663 +0200
+--- src/proto/os_amiga.pro	2015-03-21 16:50:36.223078295 +0100
+***************
+*** 26,32 ****
+  void mch_hide __ARGS((char_u *name));
+  int mch_isdir __ARGS((char_u *name));
+  int mch_mkdir __ARGS((char_u *name));
+! int mch_can_exe __ARGS((char_u *name, char_u **path));
+  int mch_nodetype __ARGS((char_u *name));
+  void mch_early_init __ARGS((void));
+  void mch_exit __ARGS((int r));
+--- 26,32 ----
+  void mch_hide __ARGS((char_u *name));
+  int mch_isdir __ARGS((char_u *name));
+  int mch_mkdir __ARGS((char_u *name));
+! int mch_can_exe __ARGS((char_u *name, char_u **path, int use_path));
+  int mch_nodetype __ARGS((char_u *name));
+  void mch_early_init __ARGS((void));
+  void mch_exit __ARGS((int r));
+*** ../vim-7.4.671/src/proto/os_msdos.pro	2014-04-01 21:00:45.436733663 +0200
+--- src/proto/os_msdos.pro	2015-03-21 16:50:39.659039386 +0100
+***************
+*** 38,44 ****
+  int mch_setperm __ARGS((char_u *name, long perm));
+  void mch_hide __ARGS((char_u *name));
+  int mch_isdir __ARGS((char_u *name));
+! int mch_can_exe __ARGS((char_u *name, char_u **path));
+  int mch_nodetype __ARGS((char_u *name));
+  int mch_dirname __ARGS((char_u *buf, int len));
+  int mch_remove __ARGS((char_u *name));
+--- 38,44 ----
+  int mch_setperm __ARGS((char_u *name, long perm));
+  void mch_hide __ARGS((char_u *name));
+  int mch_isdir __ARGS((char_u *name));
+! int mch_can_exe __ARGS((char_u *name, char_u **path, int use_path));
+  int mch_nodetype __ARGS((char_u *name));
+  int mch_dirname __ARGS((char_u *buf, int len));
+  int mch_remove __ARGS((char_u *name));
+*** ../vim-7.4.671/src/proto/os_unix.pro	2014-04-01 21:00:45.440733663 +0200
+--- src/proto/os_unix.pro	2015-03-21 16:50:44.534984171 +0100
+***************
+*** 42,48 ****
+  void mch_free_acl __ARGS((vim_acl_T aclent));
+  void mch_hide __ARGS((char_u *name));
+  int mch_isdir __ARGS((char_u *name));
+! int mch_can_exe __ARGS((char_u *name, char_u **path));
+  int mch_nodetype __ARGS((char_u *name));
+  void mch_early_init __ARGS((void));
+  void mch_free_mem __ARGS((void));
+--- 42,48 ----
+  void mch_free_acl __ARGS((vim_acl_T aclent));
+  void mch_hide __ARGS((char_u *name));
+  int mch_isdir __ARGS((char_u *name));
+! int mch_can_exe __ARGS((char_u *name, char_u **path, int use_path));
+  int mch_nodetype __ARGS((char_u *name));
+  void mch_early_init __ARGS((void));
+  void mch_free_mem __ARGS((void));
+*** ../vim-7.4.671/src/proto/os_win32.pro	2014-04-01 21:00:45.440733663 +0200
+--- src/proto/os_win32.pro	2015-03-21 16:50:48.558938605 +0100
+***************
+*** 26,32 ****
+  int mch_is_linked __ARGS((char_u *fname));
+  int win32_fileinfo __ARGS((char_u *fname, BY_HANDLE_FILE_INFORMATION *info));
+  int mch_writable __ARGS((char_u *name));
+! int mch_can_exe __ARGS((char_u *name, char_u **path));
+  int mch_nodetype __ARGS((char_u *name));
+  vim_acl_T mch_get_acl __ARGS((char_u *fname));
+  void mch_set_acl __ARGS((char_u *fname, vim_acl_T acl));
+--- 26,32 ----
+  int mch_is_linked __ARGS((char_u *fname));
+  int win32_fileinfo __ARGS((char_u *fname, BY_HANDLE_FILE_INFORMATION *info));
+  int mch_writable __ARGS((char_u *name));
+! int mch_can_exe __ARGS((char_u *name, char_u **path, int use_path));
+  int mch_nodetype __ARGS((char_u *name));
+  vim_acl_T mch_get_acl __ARGS((char_u *fname));
+  void mch_set_acl __ARGS((char_u *fname, vim_acl_T acl));
+*** ../vim-7.4.671/src/version.c	2015-03-21 14:20:11.524982691 +0100
+--- src/version.c	2015-03-21 15:54:19.693311748 +0100
+***************
+*** 743,744 ****
+--- 743,746 ----
+  {   /* Add new patch number below this line */
++ /**/
++     672,
+  /**/
+
+-- 
+ARTHUR:        A scratch?  Your arm's off!
+BLACK KNIGHT:  No, it isn't.
+ARTHUR:        Well, what's that then?
+BLACK KNIGHT:  I've had worse.
+                                  The Quest for the Holy Grail (Monty Python)
+
+ /// 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    ///