diff options
-rw-r--r-- | src/ex_getln.c | 3 | ||||
-rw-r--r-- | src/misc1.c | 40 | ||||
-rw-r--r-- | src/proto/misc1.pro | 1 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 45 insertions, 1 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c index 153712887..08a7855e6 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -4422,7 +4422,8 @@ ExpandFromContext(xp, pat, num_file, file, options) flags |= EW_FILE; else flags = (flags | EW_DIR) & ~EW_FILE; - ret = expand_wildcards(1, &pat, num_file, file, flags); + /* Expand wildcards, supporting %:h and the like. */ + ret = expand_wildcards_eval(&pat, num_file, file, flags); if (free_pat) vim_free(pat); return ret; diff --git a/src/misc1.c b/src/misc1.c index aa9021507..7da8701cb 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -8447,6 +8447,46 @@ fast_breakcheck() } /* + * Invoke expand_wildcards() for one pattern. + * Expand items like "%:h" before the expansion. + * Returns OK or FAIL. + */ + int +expand_wildcards_eval(pat, num_file, file, flags) + char_u **pat; /* pointer to input pattern */ + int *num_file; /* resulting number of files */ + char_u ***file; /* array of resulting files */ + int flags; /* EW_DIR, etc. */ +{ + int ret = FAIL; + char_u *eval_pat = NULL; + char_u *exp_pat = *pat; + char_u *ignored_msg; + int usedlen; + + if (*exp_pat == '%' || *exp_pat == '#' || *exp_pat == '<') + { + ++emsg_off; + eval_pat = eval_vars(exp_pat, exp_pat, &usedlen, + NULL, &ignored_msg, NULL); + --emsg_off; + if (eval_pat != NULL) + exp_pat = concat_str(eval_pat, exp_pat + usedlen); + } + + if (exp_pat != NULL) + ret = expand_wildcards(1, &exp_pat, num_file, file, flags); + + if (eval_pat != NULL) + { + vim_free(exp_pat); + vim_free(eval_pat); + } + + return ret; +} + +/* * Expand wildcards. Calls gen_expand_wildcards() and removes files matching * 'wildignore'. * Returns OK or FAIL. diff --git a/src/proto/misc1.pro b/src/proto/misc1.pro index a54b8b569..a036e3ea2 100644 --- a/src/proto/misc1.pro +++ b/src/proto/misc1.pro @@ -85,6 +85,7 @@ void preserve_exit __ARGS((void)); int vim_fexists __ARGS((char_u *fname)); void line_breakcheck __ARGS((void)); void fast_breakcheck __ARGS((void)); +int expand_wildcards_eval __ARGS((char_u **pat, int *num_file, char_u ***file, int flags)); int expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags)); int match_suffix __ARGS((char_u *fname)); int unix_expandpath __ARGS((garray_T *gap, char_u *path, int wildoff, int flags, int didstar)); diff --git a/src/version.c b/src/version.c index 524965eb7..80aeaa3db 100644 --- a/src/version.c +++ b/src/version.c @@ -682,6 +682,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 313, +/**/ 312, /**/ 311, |