mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.2356: Vim9: ":put =expr" does not handle a list properly
Problem: Vim9: ":put =expr" does not handle a list properly.
Solution: Use the same logic as eval_to_string_eap(). (closes vim/vim#7684)
883cf97f10
Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
parent
aac85b8d6b
commit
ac0fda2e46
@ -947,6 +947,34 @@ int skip_expr(char **pp, evalarg_T *const evalarg)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Convert "tv" to a string.
|
||||||
|
///
|
||||||
|
/// @param convert when true convert a List into a sequence of lines and convert
|
||||||
|
/// a Float to a String.
|
||||||
|
///
|
||||||
|
/// @return an allocated string.
|
||||||
|
static char *typval2string(typval_T *tv, bool convert)
|
||||||
|
{
|
||||||
|
if (convert && tv->v_type == VAR_LIST) {
|
||||||
|
garray_T ga;
|
||||||
|
ga_init(&ga, (int)sizeof(char), 80);
|
||||||
|
if (tv->vval.v_list != NULL) {
|
||||||
|
tv_list_join(&ga, tv->vval.v_list, "\n");
|
||||||
|
if (tv_list_len(tv->vval.v_list) > 0) {
|
||||||
|
ga_append(&ga, NL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ga_append(&ga, NUL);
|
||||||
|
return (char *)ga.ga_data;
|
||||||
|
}
|
||||||
|
if (convert && tv->v_type == VAR_FLOAT) {
|
||||||
|
char numbuf[NUMBUFLEN];
|
||||||
|
vim_snprintf(numbuf, NUMBUFLEN, "%g", tv->vval.v_float);
|
||||||
|
return xstrdup(numbuf);
|
||||||
|
}
|
||||||
|
return xstrdup(tv_get_string(tv));
|
||||||
|
}
|
||||||
|
|
||||||
/// Top level evaluation function, returning a string.
|
/// Top level evaluation function, returning a string.
|
||||||
///
|
///
|
||||||
/// @param convert when true convert a List into a sequence of lines and convert
|
/// @param convert when true convert a List into a sequence of lines and convert
|
||||||
@ -957,28 +985,11 @@ char *eval_to_string(char *arg, bool convert)
|
|||||||
{
|
{
|
||||||
typval_T tv;
|
typval_T tv;
|
||||||
char *retval;
|
char *retval;
|
||||||
garray_T ga;
|
|
||||||
|
|
||||||
if (eval0(arg, &tv, NULL, &EVALARG_EVALUATE) == FAIL) {
|
if (eval0(arg, &tv, NULL, &EVALARG_EVALUATE) == FAIL) {
|
||||||
retval = NULL;
|
retval = NULL;
|
||||||
} else {
|
} else {
|
||||||
if (convert && tv.v_type == VAR_LIST) {
|
retval = typval2string(&tv, convert);
|
||||||
ga_init(&ga, (int)sizeof(char), 80);
|
|
||||||
if (tv.vval.v_list != NULL) {
|
|
||||||
tv_list_join(&ga, tv.vval.v_list, "\n");
|
|
||||||
if (tv_list_len(tv.vval.v_list) > 0) {
|
|
||||||
ga_append(&ga, NL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ga_append(&ga, NUL);
|
|
||||||
retval = (char *)ga.ga_data;
|
|
||||||
} else if (convert && tv.v_type == VAR_FLOAT) {
|
|
||||||
char numbuf[NUMBUFLEN];
|
|
||||||
vim_snprintf(numbuf, NUMBUFLEN, "%g", tv.vval.v_float);
|
|
||||||
retval = xstrdup(numbuf);
|
|
||||||
} else {
|
|
||||||
retval = xstrdup(tv_get_string(&tv));
|
|
||||||
}
|
|
||||||
tv_clear(&tv);
|
tv_clear(&tv);
|
||||||
}
|
}
|
||||||
clear_evalarg(&EVALARG_EVALUATE, NULL);
|
clear_evalarg(&EVALARG_EVALUATE, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user