]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.465 v7.3.465
authorBram Moolenaar <Bram@vim.org>
Wed, 7 Mar 2012 18:18:23 +0000 (19:18 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 7 Mar 2012 18:18:23 +0000 (19:18 +0100)
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)

runtime/doc/eval.txt
src/eval.c
src/ex_getln.c
src/version.c
src/vim.h

index 0b7a3ed8f34b0302b49c101842f598bcdca7e0f9..7de0e9a31106190da924cd8bf7fd7743dcb73798 100644 (file)
@@ -1746,7 +1746,8 @@ exists( {expr})                   Number  TRUE if {expr} exists
 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}
+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
@@ -1800,7 +1801,8 @@ gettabwinvar( {tabnr}, {winnr}, {name})
 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}
+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
@@ -2802,10 +2804,10 @@ expand({expr} [, {flag}])                               *expand()*
                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: >
+               {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
index 848c6670d6f0870229fc81761c837a5207ff51fe..10564226559bac0b4fcb5b485a35c508d3da0280 100644 (file)
@@ -7852,7 +7852,7 @@ static struct fst
 #ifdef FEAT_FLOAT
     {"exp",            1, 1, f_exp},
 #endif
-    {"expand",         1, 2, f_expand},
+    {"expand",         1, 3, f_expand},
     {"extend",         2, 3, f_extend},
     {"feedkeys",       1, 2, f_feedkeys},
     {"file_readable",  1, 1, f_filereadable},  /* obsolete */
@@ -7903,7 +7903,7 @@ static struct fst
     {"getwinposx",     0, 0, f_getwinposx},
     {"getwinposy",     0, 0, f_getwinposy},
     {"getwinvar",      2, 2, f_getwinvar},
-    {"glob",           1, 2, f_glob},
+    {"glob",           1, 3, f_glob},
     {"globpath",       2, 3, f_globpath},
     {"has",            1, 1, f_has},
     {"has_key",                2, 2, f_has_key},
@@ -10019,14 +10019,33 @@ f_expand(argvars, rettv)
     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;
-       rettv->vval.v_string = eval_vars(s, s, &len, NULL, &errormsg, NULL);
+       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,7 +10060,18 @@ f_expand(argvars, rettv)
            xpc.xp_context = EXPAND_FILES;
            if (p_wic)
                options += WILD_ICASE;
-           rettv->vval.v_string = ExpandOne(&xpc, s, NULL, options, WILD_ALL);
+           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,19 +11863,39 @@ f_glob(argvars, rettv)
     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;
+     * 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;
-       rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
+       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;
index f811889d31c34df2f675664c0cc113c726dc73bb..38775af605b1361d63962f10d3f53eb650b7f56c 100644 (file)
@@ -3461,6 +3461,7 @@ nextwild(xp, type, options)
  * 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,7 +3585,8 @@ ExpandOne(xp, str, orig, options, mode)
            /*
             * Check for matching suffixes in file names.
             */
-           if (mode != WILD_ALL && mode != WILD_LONGEST)
+           if (mode != WILD_ALL && mode != WILD_ALL_KEEP
+                                                     && mode != WILD_LONGEST)
            {
                if (xp->xp_numfiles)
                    non_suf_match = xp->xp_numfiles;
index b5e7a0ccb3a9be66b49ffeefecbacb5937722ce6..6d6261fe2e5e8cf2789001046304a63a3423773d 100644 (file)
@@ -715,7 +715,7 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
-    464,
+    465,
 /**/
     464,
 /**/
index 127387aa0d6e83d79ff33c50bba136a01dbf1ec2..be182287d28ccc25ad5a23752d5d433dc1a71fef 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -794,6 +794,7 @@ extern char *(*dyn_libintl_textdomain)(const char *domainname);
 #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