comparison 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
comparison
equal deleted inserted replaced
9435:eb1692f10ce6 9436:f048e5a27253
11343 } 11343 }
11344 else if (*s != NUL) 11344 else if (*s != NUL)
11345 EMSG(_(e_trailing)); 11345 EMSG(_(e_trailing));
11346 } 11346 }
11347 11347
11348 static garray_T redir_evalcmd_ga;
11349
11350 /*
11351 * Append "value[value_len]" to the evalcmd() output.
11352 */
11353 void
11354 evalcmd_redir_str(char_u *value, int value_len)
11355 {
11356 int len;
11357
11358 if (value_len == -1)
11359 len = (int)STRLEN(value); /* Append the entire string */
11360 else
11361 len = value_len; /* Append only "value_len" characters */
11362 if (ga_grow(&redir_evalcmd_ga, len) == OK)
11363 {
11364 mch_memmove((char *)redir_evalcmd_ga.ga_data
11365 + redir_evalcmd_ga.ga_len, value, len);
11366 redir_evalcmd_ga.ga_len += len;
11367 }
11368 }
11369
11348 /* 11370 /*
11349 * "evalcmd()" function 11371 * "evalcmd()" function
11350 */ 11372 */
11351 static void 11373 static void
11352 f_evalcmd(typval_T *argvars, typval_T *rettv) 11374 f_evalcmd(typval_T *argvars, typval_T *rettv)
11353 { 11375 {
11354 char_u *s; 11376 char_u *s;
11377 int save_msg_silent = msg_silent;
11378 int save_redir_evalcmd = redir_evalcmd;
11379 garray_T save_ga;
11355 11380
11356 rettv->vval.v_string = NULL; 11381 rettv->vval.v_string = NULL;
11357 rettv->v_type = VAR_STRING; 11382 rettv->v_type = VAR_STRING;
11358 11383
11359 s = get_tv_string_chk(&argvars[0]); 11384 s = get_tv_string_chk(&argvars[0]);
11360 if (s != NULL) 11385 if (s != NULL)
11361 { 11386 {
11362 redir_vname = TRUE; 11387 if (redir_evalcmd)
11363 redir_lval = (lval_T *)&redir_lval; 11388 save_ga = redir_evalcmd_ga;
11364 ga_init2(&redir_ga, (int)sizeof(char), 500); 11389 ga_init2(&redir_evalcmd_ga, (int)sizeof(char), 500);
11365 11390 redir_evalcmd = TRUE;
11366 if (do_cmdline_cmd(s) == OK) 11391
11367 rettv->vval.v_string = redir_ga.ga_data; 11392 ++msg_silent;
11368 else 11393 do_cmdline_cmd(s);
11369 vim_free(redir_ga.ga_data); 11394 rettv->vval.v_string = redir_evalcmd_ga.ga_data;
11370 11395 msg_silent = save_msg_silent;
11371 redir_ga.ga_data = NULL; 11396
11372 redir_vname = FALSE; 11397 redir_evalcmd = save_redir_evalcmd;
11373 redir_lval = NULL; 11398 if (redir_evalcmd)
11374 } 11399 redir_evalcmd_ga = save_ga;
11375 11400 }
11376 } 11401 }
11377 11402
11378 /* 11403 /*
11379 * "eventhandler()" function 11404 * "eventhandler()" function
11380 */ 11405 */