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