diff src/eval.c @ 9436:f048e5a27253 v7.4.1999

commit https://github.com/vim/vim/commit/bc5d6dd1dd1dc3a06e4e655fc9479529db288365 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Jul 7 23:04:18 2016 +0200 patch 7.4.1999 Problem: evalcmd() doesn't work recursively. Solution: Use redir_evalcmd instead of redir_vname.
author Christian Brabandt <cb@256bit.org>
date Thu, 07 Jul 2016 23:15:05 +0200
parents e70fd2eb3ae1
children 4fe3772969cf
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -11345,6 +11345,28 @@ f_eval(typval_T *argvars, typval_T *rett
 	EMSG(_(e_trailing));
 }
 
+static garray_T	redir_evalcmd_ga;
+
+/*
+ * Append "value[value_len]" to the evalcmd() output.
+ */
+    void
+evalcmd_redir_str(char_u *value, int value_len)
+{
+    int		len;
+
+    if (value_len == -1)
+	len = (int)STRLEN(value);	/* Append the entire string */
+    else
+	len = value_len;		/* Append only "value_len" characters */
+    if (ga_grow(&redir_evalcmd_ga, len) == OK)
+    {
+	mch_memmove((char *)redir_evalcmd_ga.ga_data
+				       + redir_evalcmd_ga.ga_len, value, len);
+	redir_evalcmd_ga.ga_len += len;
+    }
+}
+
 /*
  * "evalcmd()" function
  */
@@ -11352,6 +11374,9 @@ f_eval(typval_T *argvars, typval_T *rett
 f_evalcmd(typval_T *argvars, typval_T *rettv)
 {
     char_u	*s;
+    int		save_msg_silent = msg_silent;
+    int		save_redir_evalcmd = redir_evalcmd;
+    garray_T	save_ga;
 
     rettv->vval.v_string = NULL;
     rettv->v_type = VAR_STRING;
@@ -11359,20 +11384,20 @@ f_evalcmd(typval_T *argvars, typval_T *r
     s = get_tv_string_chk(&argvars[0]);
     if (s != NULL)
     {
-	redir_vname = TRUE;
-	redir_lval = (lval_T *)&redir_lval;
-	ga_init2(&redir_ga, (int)sizeof(char), 500);
-
-	if (do_cmdline_cmd(s) == OK)
-	    rettv->vval.v_string = redir_ga.ga_data;
-	else
-	    vim_free(redir_ga.ga_data);
-
-	redir_ga.ga_data = NULL;
-	redir_vname = FALSE;
-	redir_lval = NULL;
-    }
-
+	if (redir_evalcmd)
+	    save_ga = redir_evalcmd_ga;
+	ga_init2(&redir_evalcmd_ga, (int)sizeof(char), 500);
+	redir_evalcmd = TRUE;
+
+	++msg_silent;
+	do_cmdline_cmd(s);
+	rettv->vval.v_string = redir_evalcmd_ga.ga_data;
+	msg_silent = save_msg_silent;
+
+	redir_evalcmd = save_redir_evalcmd;
+	if (redir_evalcmd)
+	    redir_evalcmd_ga = save_ga;
+    }
 }
 
 /*