From a96edb736d4274fc4aea460800780e06e1510812 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 28 Apr 2022 17:52:24 +0100 Subject: patch 8.2.4841: empty string considered an error for expand() Problem: Empty string considered an error for expand() when 'verbose' is set. (Christian Brabandt) Solution: Do not give an error for an empty result. (closes #10307) --- src/evalfunc.c | 2 +- src/ex_docmd.c | 9 +++++---- src/filepath.c | 2 +- src/proto/ex_docmd.pro | 2 +- src/testdir/test_expand_func.vim | 6 +++++- src/version.c | 2 ++ 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/evalfunc.c b/src/evalfunc.c index c4abfddc2c..4456f696db 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -4105,7 +4105,7 @@ f_expand(typval_T *argvars, typval_T *rettv) if (p_verbose == 0) ++emsg_off; - result = eval_vars(s, s, &len, NULL, &errormsg, NULL); + result = eval_vars(s, s, &len, NULL, &errormsg, NULL, FALSE); if (p_verbose == 0) --emsg_off; else if (errormsg != NULL) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 5c86cee45b..226435003d 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -4924,7 +4924,7 @@ expand_filename( * Try to find a match at this position. */ repl = eval_vars(p, eap->arg, &srclen, &(eap->do_ecmd_lnum), - errormsgp, &escaped); + errormsgp, &escaped, TRUE); if (*errormsgp != NULL) // error detected return FAIL; if (repl == NULL) // no match found @@ -9045,8 +9045,9 @@ eval_vars( int *usedlen, // characters after src that are used linenr_T *lnump, // line number for :e command, or NULL char **errormsg, // pointer to error message - int *escaped) // return value has escaped white space (can + int *escaped, // return value has escaped white space (can // be NULL) + int empty_is_error) // empty result is considered an error { int i; char_u *s; @@ -9348,7 +9349,7 @@ eval_vars( } } - if (resultlen == 0 || valid != VALID_HEAD + VALID_PATH) + if (empty_is_error && (resultlen == 0 || valid != VALID_HEAD + VALID_PATH)) { if (valid != VALID_HEAD + VALID_PATH) *errormsg = _(e_empty_file_name_for_percent_or_hash_only_works_with_ph); @@ -9389,7 +9390,7 @@ expand_sfile(char_u *arg) else { // replace "" with the sourced file name, and do ":" stuff - repl = eval_vars(p, result, &srclen, NULL, &errormsg, NULL); + repl = eval_vars(p, result, &srclen, NULL, &errormsg, NULL, TRUE); if (errormsg != NULL) { if (*errormsg) diff --git a/src/filepath.c b/src/filepath.c index 6ee5fad960..09c9f4a198 100644 --- a/src/filepath.c +++ b/src/filepath.c @@ -3097,7 +3097,7 @@ expand_wildcards_eval( { ++emsg_off; eval_pat = eval_vars(exp_pat, exp_pat, &usedlen, - NULL, &ignored_msg, NULL); + NULL, &ignored_msg, NULL, TRUE); --emsg_off; if (eval_pat != NULL) exp_pat = concat_str(eval_pat, exp_pat + usedlen); diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro index 40f2649829..d67cb9a91c 100644 --- a/src/proto/ex_docmd.pro +++ b/src/proto/ex_docmd.pro @@ -63,7 +63,7 @@ void ex_normal(exarg_T *eap); void exec_normal_cmd(char_u *cmd, int remap, int silent); void exec_normal(int was_typed, int use_vpeekc, int may_use_terminal_loop); int find_cmdline_var(char_u *src, int *usedlen); -char_u *eval_vars(char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char **errormsg, int *escaped); +char_u *eval_vars(char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char **errormsg, int *escaped, int empty_is_error); char_u *expand_sfile(char_u *arg); void dialog_msg(char_u *buff, char *format, char_u *fname); void set_no_hlsearch(int flag); diff --git a/src/testdir/test_expand_func.vim b/src/testdir/test_expand_func.vim index 3c430e1c61..59156afe32 100644 --- a/src/testdir/test_expand_func.vim +++ b/src/testdir/test_expand_func.vim @@ -82,10 +82,14 @@ endfunc func Test_expand() new - call assert_equal("", expand('%:S')) + call assert_equal("''", expand('%:S')) call assert_equal('3', ''->expand()) call assert_equal(['4'], expand('', v:false, v:true)) " Don't add any line above this, otherwise will change. + call assert_equal("", expand('%')) + set verbose=1 + call assert_equal("", expand('%')) + set verbose=0 quit endfunc diff --git a/src/version.c b/src/version.c index 0570614fc8..31306fb1a4 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4841, /**/ 4840, /**/ -- cgit v1.2.3