# HG changeset patch # User Bram Moolenaar # Date 1331144303 -3600 # Node ID d1096a4e96bdd5bfc0ce2f1aaddcbff1475c69ad # Parent 5077b4eb0d6147fddd47470bcfb5692a92c57d1d updated for version 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) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1746,7 +1746,8 @@ exists( {expr}) Number TRUE if {expr} 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 diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -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; - - rettv->v_type = VAR_STRING; + 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; - rettv->v_type = VAR_STRING; + * 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; diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -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; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -715,7 +715,7 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ - 464, + 465, /**/ 464, /**/ diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -794,6 +794,7 @@ extern char *(*dyn_libintl_textdomain)(c #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