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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui