| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.465 |
| 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.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 |
| |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 -- 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 /// |