]> granicus.if.org Git - vim/commitdiff
patch 8.2.4841: empty string considered an error for expand() v8.2.4841
authorBram Moolenaar <Bram@vim.org>
Thu, 28 Apr 2022 16:52:24 +0000 (17:52 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 28 Apr 2022 16:52:24 +0000 (17:52 +0100)
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
src/ex_docmd.c
src/filepath.c
src/proto/ex_docmd.pro
src/testdir/test_expand_func.vim
src/version.c

index c4abfddc2cb0906ae4c36154c177bd74e0802560..4456f696db6c000e021f8740046aeaaa1f922393 100644 (file)
@@ -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)
index 5c86cee45bc213fc566a23089df37e76648385fe..226435003de7075e7a162eb93c35fe14a27d9147 100644 (file)
@@ -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 "<sfile>" 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)
index 6ee5fad9603b24a56a0bfa87b536e8f742694bf2..09c9f4a198acb8379e9847fef5f8b2e56cfde83d 100644 (file)
@@ -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);
index 40f2649829e70133b28f8997ea9605f13ee2c7de..d67cb9a91c563019db7db9dcad463b6c30509c29 100644 (file)
@@ -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);
index 3c430e1c6130caa5d71a80a6f31c4ebeae08c42d..59156afe321df6eee6ced962c95691186ed858fc 100644 (file)
@@ -82,10 +82,14 @@ endfunc
 
 func Test_expand()
   new
-  call assert_equal("",  expand('%:S'))
+  call assert_equal("''", expand('%:S'))
   call assert_equal('3', '<slnum>'->expand())
   call assert_equal(['4'], expand('<slnum>', v:false, v:true))
   " Don't add any line above this, otherwise <slnum> will change.
+  call assert_equal("", expand('%'))
+  set verbose=1
+  call assert_equal("", expand('%'))
+  set verbose=0
   quit
 endfunc
 
index 0570614fc8ffa9355b8c8108edd33f610dfa6455..31306fb1a4badc278c79ec579534a1eedb5d3a05 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4841,
 /**/
     4840,
 /**/