To: vim_dev@googlegroups.com Subject: Patch 7.3.465 Fcc: outbox From: Bram Moolenaar 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 *** ../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 ! 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 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 ---- autocmd buffer number (as a String!) autocmd matched name sourced script file name + sourced script file line number word under the cursor WORD under the cursor 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 ! 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 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 -- 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 ///