Mercurial > vim
diff src/vim9execute.c @ 19528:3b026343f398 v8.2.0321
patch 8.2.0321: Vim9: ":execute" does not work yet
Commit: https://github.com/vim/vim/commit/ad39c094d261109a695aba2c4f19fe336736cc55
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Feb 26 18:23:43 2020 +0100
patch 8.2.0321: Vim9: ":execute" does not work yet
Problem: Vim9: ":execute" does not work yet.
Solution: Add ISN_EXECUTE. (closes https://github.com/vim/vim/issues/5699) Also make :echo work with more
than one argument.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 26 Feb 2020 18:30:04 +0100 |
parents | 798fce18d049 |
children | b8f778dda1a1 |
line wrap: on
line diff
--- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -533,6 +533,48 @@ call_def_function( } break; + // execute :execute {string} ... + case ISN_EXECUTE: + { + int count = iptr->isn_arg.number; + garray_T ga; + char_u buf[NUMBUFLEN]; + char_u *p; + int len; + int failed = FALSE; + + ga_init2(&ga, 1, 80); + for (idx = 0; idx < count; ++idx) + { + tv = STACK_TV_BOT(idx - count); + if (tv->v_type == VAR_CHANNEL || tv->v_type == VAR_JOB) + { + emsg(_(e_inval_string)); + break; + } + else + p = tv_get_string_buf(tv, buf); + + len = (int)STRLEN(p); + if (ga_grow(&ga, len + 2) == FAIL) + failed = TRUE; + else + { + if (ga.ga_len > 0) + ((char_u *)(ga.ga_data))[ga.ga_len++] = ' '; + STRCPY((char_u *)(ga.ga_data) + ga.ga_len, p); + ga.ga_len += len; + } + clear_tv(tv); + } + ectx.ec_stack.ga_len -= count; + + if (!failed && ga.ga_data != NULL) + do_cmdline_cmd((char_u *)ga.ga_data); + ga_clear(&ga); + } + break; + // load local variable or argument case ISN_LOAD: if (ga_grow(&ectx.ec_stack, 1) == FAIL) @@ -1666,6 +1708,9 @@ ex_disassemble(exarg_T *eap) echo->echo_count); } break; + case ISN_EXECUTE: + smsg("%4d EXECUTE %d", current, iptr->isn_arg.number); + break; case ISN_LOAD: if (iptr->isn_arg.number < 0) smsg("%4d LOAD arg[%lld]", current,