Mercurial > vim
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; + } } /*