diff src/evalfunc.c @ 28307:425700af491b v8.2.4679

patch 8.2.4679: cannot have expandcmd() give an error message for mistakes Commit: https://github.com/vim/vim/commit/2b74b6805b5c8c4836b66df5d949f5ff6a77f8c7 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sun Apr 3 21:30:32 2022 +0100 patch 8.2.4679: cannot have expandcmd() give an error message for mistakes Problem: Cannot have expandcmd() give an error message for mistakes. Solution: Add an optional argument to give errors. Fix memory leak when expanding files fails. (Yegappan Lakshmanan, closes #10071)
author Bram Moolenaar <Bram@vim.org>
date Sun, 03 Apr 2022 22:45:04 +0200
parents 9849df834f1d
children 1170b35651a5
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1761,7 +1761,7 @@ static funcentry_T global_functions[] =
 			ret_float,	    FLOAT_FUNC(f_exp)},
     {"expand",		1, 3, FEARG_1,	    arg3_string_bool_bool,
 			ret_any,	    f_expand},
-    {"expandcmd",	1, 1, FEARG_1,	    arg1_string,
+    {"expandcmd",	1, 2, FEARG_1,	    arg2_string_dict,
 			ret_string,	    f_expandcmd},
     {"extend",		2, 3, FEARG_1,	    arg23_extend,
 			ret_extend,	    f_extend},
@@ -4152,9 +4152,17 @@ f_expandcmd(typval_T *argvars, typval_T 
     exarg_T	eap;
     char_u	*cmdstr;
     char	*errormsg = NULL;
-
-    if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
-	return;
+    int		emsgoff = TRUE;
+
+    if (in_vim9script()
+	    && (check_for_string_arg(argvars, 0) == FAIL
+		|| check_for_opt_dict_arg(argvars, 1) == FAIL))
+	return;
+
+    if (argvars[1].v_type == VAR_DICT
+	    && dict_get_bool(argvars[1].vval.v_dict, (char_u *)"errmsg",
+								VVAL_FALSE))
+	emsgoff = FALSE;
 
     rettv->v_type = VAR_STRING;
     cmdstr = vim_strsave(tv_get_string(&argvars[0]));
@@ -4167,9 +4175,13 @@ f_expandcmd(typval_T *argvars, typval_T 
     eap.nextcmd = NULL;
     eap.cmdidx = CMD_USER;
 
-    ++emsg_off;
-    expand_filename(&eap, &cmdstr, &errormsg);
-    --emsg_off;
+    if (emsgoff)
+	++emsg_off;
+    if (expand_filename(&eap, &cmdstr, &errormsg) == FAIL)
+	if (!emsgoff && errormsg != NULL && *errormsg != NUL)
+	    emsg(errormsg);
+    if (emsgoff)
+	--emsg_off;
 
     rettv->vval.v_string = cmdstr;
 }