Patch 7.3.465
Problem:    Cannot get file name with newline from glob().
Solution:   Add argument to glob() and expand() to indicate they must return a
            list. (Christian Brabandt)
Files:      runtime/doc/eval.txt, src/eval.c, src/ex_getln.c, src/vim.h


*** ../vim-7.3.464/runtime/doc/eval.txt 2011-12-14 15:32:44.000000000 +0100
--- runtime/doc/eval.txt        2012-03-07 18:49:26.000000000 +0100
***************
*** 1738,1744 ****
  extend( {expr1}, {expr2} [, {expr3}])
                                List/Dict insert items of {expr2} into {expr1}
  exp( {expr})                  Float   exponential of {expr}
! expand( {expr} [, {flag}])    String  expand special keywords in {expr}
  feedkeys( {string} [, {mode}])        Number  add key sequence to typeahead 
buffer
  filereadable( {file})         Number  TRUE if {file} is a readable file
  filewritable( {file})         Number  TRUE if {file} is a writable file
--- 1746,1753 ----
  extend( {expr1}, {expr2} [, {expr3}])
                                List/Dict insert items of {expr2} into {expr1}
  exp( {expr})                  Float   exponential of {expr}
! expand( {expr} [, {nosuf} [, {list}]])
!                               any     expand special keywords in {expr}
  feedkeys( {string} [, {mode}])        Number  add key sequence to typeahead 
buffer
  filereadable( {file})         Number  TRUE if {file} is a readable file
  filewritable( {file})         Number  TRUE if {file} is a writable file
***************
*** 1792,1798 ****
  getwinposx()                  Number  X coord in pixels of GUI Vim window
  getwinposy()                  Number  Y coord in pixels of GUI Vim window
  getwinvar( {nr}, {varname})   any     variable {varname} in window {nr}
! glob( {expr} [, {flag}])      String  expand file wildcards in {expr}
  globpath( {path}, {expr} [, {flag}])
                                String  do glob({expr}) for all dirs in {path}
  has( {feature})                       Number  TRUE if feature {feature} 
supported
--- 1801,1808 ----
  getwinposx()                  Number  X coord in pixels of GUI Vim window
  getwinposy()                  Number  Y coord in pixels of GUI Vim window
  getwinvar( {nr}, {varname})   any     variable {varname} in window {nr}
! glob( {expr} [, {nosuf} [, {list}]])
!                               any     expand file wildcards in {expr}
  globpath( {path}, {expr} [, {flag}])
                                String  do glob({expr}) for all dirs in {path}
  has( {feature})                       Number  TRUE if feature {feature} 
supported
***************
*** 2731,2743 ****
                {only available when compiled with the |+float| feature}
  
  
! expand({expr} [, {flag}])                             *expand()*
                Expand wildcards and the following special keywords in {expr}.
!               The result is a String.
  
!               When there are several matches, they are separated by <NL>
!               characters.  [Note: in version 5.0 a space was used, which
!               caused problems when a file name contains a space]
  
                If the expansion fails, the result is an empty string.  A name
                for a non-existing file is not included.
--- 2744,2758 ----
                {only available when compiled with the |+float| feature}
  
  
! expand({expr} [, {nosuf} [, {list}]])                         *expand()*
                Expand wildcards and the following special keywords in {expr}.
!               'wildignorecase' applies.
  
!               If {list} is given and it is non-zero, a List will be returned.
!               Otherwise the result is a String and when there are several
!               matches, they are separated by <NL> characters.  [Note: in
!               version 5.0 a space was used, which caused problems when a
!               file name contains a space]
  
                If the expansion fails, the result is an empty string.  A name
                for a non-existing file is not included.
***************
*** 2754,2759 ****
--- 2769,2775 ----
                        <abuf>          autocmd buffer number (as a String!)
                        <amatch>        autocmd matched name
                        <sfile>         sourced script file name
+                       <slnum>         sourced script file line number
                        <cword>         word under the cursor
                        <cWORD>         WORD under the cursor
                        <client>        the {clientid} of the last received
***************
*** 2790,2799 ****
                When {expr} does not start with '%', '#' or '<', it is
                expanded like a file name is expanded on the command line.
                'suffixes' and 'wildignore' are used, unless the optional
!               {flag} argument is given and it is non-zero.  Names for
!               non-existing files are included.  The "**" item can be used to
!               search in a directory tree.  For example, to find all "README"
!               files in the current directory and below: >
                        :echo expand("**/README")
  <
                Expand() can also be used to expand variables and environment
--- 2806,2815 ----
                When {expr} does not start with '%', '#' or '<', it is
                expanded like a file name is expanded on the command line.
                'suffixes' and 'wildignore' are used, unless the optional
!               {nosuf} argument is given and it is non-zero.
!               Names for non-existing files are included.  The "**" item can
!               be used to search in a directory tree.  For example, to find
!               all "README" files in the current directory and below: >
                        :echo expand("**/README")
  <
                Expand() can also be used to expand variables and environment
***************
*** 3437,3453 ****
                        :let list_is_on = getwinvar(2, '&list')
                        :echo "myvar = " . getwinvar(1, 'myvar')
  <
! glob({expr} [, {flag}])                                       *glob()*
                Expand the file wildcards in {expr}.  See |wildcards| for the
                use of special characters.
!               The result is a String.
!               When there are several matches, they are separated by <NL>
!               characters.
!               Unless the optional {flag} argument is given and is non-zero,
                the 'suffixes' and 'wildignore' options apply: Names matching
                one of the patterns in 'wildignore' will be skipped and
                'suffixes' affect the ordering of matches.
!               If the expansion fails, the result is an empty string.
                A name for a non-existing file is not included.
  
                For most systems backticks can be used to get files names from
--- 3456,3478 ----
                        :let list_is_on = getwinvar(2, '&list')
                        :echo "myvar = " . getwinvar(1, 'myvar')
  <
! glob({expr} [, {nosuf} [, {list}]])                           *glob()*
                Expand the file wildcards in {expr}.  See |wildcards| for the
                use of special characters.
! 
!               Unless the optional {nosuf} argument is given and is non-zero,
                the 'suffixes' and 'wildignore' options apply: Names matching
                one of the patterns in 'wildignore' will be skipped and
                'suffixes' affect the ordering of matches.
!               'wildignorecase' always applies.
! 
!               When {list} is present and it is non-zero the result is a List
!               with all matching files. The advantage of using a List is,
!               you also get filenames containing newlines correctly.
!               Otherwise the result is a String and when there are several
!               matches, they are separated by <NL> characters.
! 
!               If the expansion fails, the result is an empty String or List.
                A name for a non-existing file is not included.
  
                For most systems backticks can be used to get files names from
*** ../vim-7.3.464/src/eval.c   2012-02-11 20:44:01.000000000 +0100
--- src/eval.c  2012-03-07 19:08:36.000000000 +0100
***************
*** 7852,7858 ****
  #ifdef FEAT_FLOAT
      {"exp",           1, 1, f_exp},
  #endif
!     {"expand",                1, 2, f_expand},
      {"extend",                2, 3, f_extend},
      {"feedkeys",      1, 2, f_feedkeys},
      {"file_readable", 1, 1, f_filereadable},  /* obsolete */
--- 7852,7858 ----
  #ifdef FEAT_FLOAT
      {"exp",           1, 1, f_exp},
  #endif
!     {"expand",                1, 3, f_expand},
      {"extend",                2, 3, f_extend},
      {"feedkeys",      1, 2, f_feedkeys},
      {"file_readable", 1, 1, f_filereadable},  /* obsolete */
***************
*** 7903,7909 ****
      {"getwinposx",    0, 0, f_getwinposx},
      {"getwinposy",    0, 0, f_getwinposy},
      {"getwinvar",     2, 2, f_getwinvar},
!     {"glob",          1, 2, f_glob},
      {"globpath",      2, 3, f_globpath},
      {"has",           1, 1, f_has},
      {"has_key",               2, 2, f_has_key},
--- 7903,7909 ----
      {"getwinposx",    0, 0, f_getwinposx},
      {"getwinposy",    0, 0, f_getwinposy},
      {"getwinvar",     2, 2, f_getwinvar},
!     {"glob",          1, 3, f_glob},
      {"globpath",      2, 3, f_globpath},
      {"has",           1, 1, f_has},
      {"has_key",               2, 2, f_has_key},
***************
*** 10019,10032 ****
      int               options = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND;
      expand_T  xpc;
      int               error = FALSE;
  
      rettv->v_type = VAR_STRING;
      s = get_tv_string(&argvars[0]);
      if (*s == '%' || *s == '#' || *s == '<')
      {
        ++emsg_off;
!       rettv->vval.v_string = eval_vars(s, s, &len, NULL, &errormsg, NULL);
        --emsg_off;
      }
      else
      {
--- 10019,10051 ----
      int               options = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND;
      expand_T  xpc;
      int               error = FALSE;
+     char_u    *result;
  
      rettv->v_type = VAR_STRING;
+     if (argvars[1].v_type != VAR_UNKNOWN
+           && argvars[2].v_type != VAR_UNKNOWN
+           && get_tv_number_chk(&argvars[2], &error)
+           && !error)
+     {
+       rettv->v_type = VAR_LIST;
+       rettv->vval.v_list = NULL;
+     }
+ 
      s = get_tv_string(&argvars[0]);
      if (*s == '%' || *s == '#' || *s == '<')
      {
        ++emsg_off;
!       result = eval_vars(s, s, &len, NULL, &errormsg, NULL);
        --emsg_off;
+       if (rettv->v_type == VAR_LIST)
+       {
+           if (rettv_list_alloc(rettv) != FAIL && result != NULL)
+               list_append_string(rettv->vval.v_list, result, -1);
+           else
+               vim_free(result);
+       }
+       else
+           rettv->vval.v_string = result;
      }
      else
      {
***************
*** 10041,10047 ****
            xpc.xp_context = EXPAND_FILES;
            if (p_wic)
                options += WILD_ICASE;
!           rettv->vval.v_string = ExpandOne(&xpc, s, NULL, options, WILD_ALL);
        }
        else
            rettv->vval.v_string = NULL;
--- 10060,10077 ----
            xpc.xp_context = EXPAND_FILES;
            if (p_wic)
                options += WILD_ICASE;
!           if (rettv->v_type == VAR_STRING)
!               rettv->vval.v_string = ExpandOne(&xpc, s, NULL,
!                                                          options, WILD_ALL);
!           else if (rettv_list_alloc(rettv) != FAIL)
!           {
!               int i;
! 
!               ExpandOne(&xpc, s, NULL, options, WILD_ALL_KEEP);
!               for (i = 0; i < xpc.xp_numfiles; i++)
!                   list_append_string(rettv->vval.v_list, xpc.xp_files[i], -1);
!               ExpandCleanup(&xpc);
!           }
        }
        else
            rettv->vval.v_string = NULL;
***************
*** 11833,11851 ****
      int               error = FALSE;
  
      /* When the optional second argument is non-zero, don't remove matches
!     * for 'wildignore' and don't put matches for 'suffixes' at the end. */
!     if (argvars[1].v_type != VAR_UNKNOWN
!                               && get_tv_number_chk(&argvars[1], &error))
!       options |= WILD_KEEP_ALL;
      rettv->v_type = VAR_STRING;
      if (!error)
      {
        ExpandInit(&xpc);
        xpc.xp_context = EXPAND_FILES;
        if (p_wic)
            options += WILD_ICASE;
!       rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
                                                     NULL, options, WILD_ALL);
      }
      else
        rettv->vval.v_string = NULL;
--- 11863,11901 ----
      int               error = FALSE;
  
      /* When the optional second argument is non-zero, don't remove matches
!      * for 'wildignore' and don't put matches for 'suffixes' at the end. */
      rettv->v_type = VAR_STRING;
+     if (argvars[1].v_type != VAR_UNKNOWN)
+     {
+       if (get_tv_number_chk(&argvars[1], &error))
+           options |= WILD_KEEP_ALL;
+       if (argvars[2].v_type != VAR_UNKNOWN
+                                   && get_tv_number_chk(&argvars[2], &error))
+       {
+           rettv->v_type = VAR_LIST;
+           rettv->vval.v_list = NULL;
+       }
+     }
      if (!error)
      {
        ExpandInit(&xpc);
        xpc.xp_context = EXPAND_FILES;
        if (p_wic)
            options += WILD_ICASE;
!       if (rettv->v_type == VAR_STRING)
!           rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
                                                     NULL, options, WILD_ALL);
+       else if (rettv_list_alloc(rettv) != FAIL)
+       {
+         int i;
+ 
+         ExpandOne(&xpc, get_tv_string(&argvars[0]),
+                                               NULL, options, WILD_ALL_KEEP);
+         for (i = 0; i < xpc.xp_numfiles; i++)
+             list_append_string(rettv->vval.v_list, xpc.xp_files[i], -1);
+ 
+         ExpandCleanup(&xpc);
+       }
      }
      else
        rettv->vval.v_string = NULL;
*** ../vim-7.3.464/src/ex_getln.c       2012-02-22 17:58:00.000000000 +0100
--- src/ex_getln.c      2012-03-07 19:07:01.000000000 +0100
***************
*** 3461,3466 ****
--- 3461,3467 ----
   * mode = WILD_PREV:      use previous match in multiple match, wrap to first
   * mode = WILD_ALL:       return all matches concatenated
   * mode = WILD_LONGEST:           return longest matched part
+  * mode = WILD_ALL_KEEP:    get all matches, keep matches
   *
   * options = WILD_LIST_NOTFOUND:    list entries without a match
   * options = WILD_HOME_REPLACE:           do home_replace() for buffer names
***************
*** 3584,3590 ****
            /*
             * Check for matching suffixes in file names.
             */
!           if (mode != WILD_ALL && mode != WILD_LONGEST)
            {
                if (xp->xp_numfiles)
                    non_suf_match = xp->xp_numfiles;
--- 3585,3592 ----
            /*
             * Check for matching suffixes in file names.
             */
!           if (mode != WILD_ALL && mode != WILD_ALL_KEEP
!                                                     && mode != WILD_LONGEST)
            {
                if (xp->xp_numfiles)
                    non_suf_match = xp->xp_numfiles;
*** ../vim-7.3.464/src/vim.h    2011-07-27 17:31:42.000000000 +0200
--- src/vim.h   2012-03-07 19:03:43.000000000 +0100
***************
*** 794,799 ****
--- 794,800 ----
  #define WILD_PREV             5
  #define WILD_ALL              6
  #define WILD_LONGEST          7
+ #define WILD_ALL_KEEP         8
  
  #define WILD_LIST_NOTFOUND    1
  #define WILD_HOME_REPLACE     2
*** ../vim-7.3.464/src/version.c        2012-03-07 18:04:00.000000000 +0100
--- src/version.c       2012-03-07 19:14:39.000000000 +0100
***************
*** 716,717 ****
--- 716,719 ----
  {   /* Add new patch number below this line */
+ /**/
+     465,
  /**/

-- 
Although the scythe isn't pre-eminent among the weapons of war, anyone who
has been on the wrong end of, say, a peasants' revolt will know that in
skilled hands it is fearsome.
                                        -- (Terry Pratchett, Mort)

 /// 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

Raspunde prin e-mail lui