From: Bram Moolenaar Date: Sat, 5 Jun 2021 15:10:55 +0000 (+0200) Subject: patch 8.2.2941: Vim9: using does not handle a list of strings X-Git-Tag: v8.2.2941 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b288ba9f1dd29ba34f236e3099f779d5ab130227;p=vim patch 8.2.2941: Vim9: using does not handle a list of strings Problem: Vim9: using does not handle a list of strings. Solution: Convert a list to a string and escape each item. (closes #8310) --- diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index 87832ce2e..6b31a6222 100644 --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -34,6 +34,10 @@ def Test_edit_wildcards() CheckDefFailure(['edit `=xxx`'], 'E1001:') CheckDefFailure(['edit `="foo"'], 'E1083:') + + var files = ['file 1', 'file%2', 'file# 3'] + args `=files` + assert_equal(files, argv()) enddef def Test_expand_alternate_file() diff --git a/src/version.c b/src/version.c index e244d4b95..0f539ca2e 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2941, /**/ 2940, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index b23879d3e..982667829 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -999,15 +999,34 @@ do_2string(typval_T *tv, int is_2string_any, int tolerant) case VAR_LIST: if (tolerant) { - char_u *p; + char_u *s, *e, *p; + garray_T ga; + ga_init2(&ga, sizeof(char_u *), 1); + + // Convert to NL separated items, then + // escape the items and replace the NL with + // a space. str = typval2string(tv, TRUE); + if (str == NULL) + return FAIL; + s = str; + while ((e = vim_strchr(s, '\n')) != NULL) + { + *e = NUL; + p = vim_strsave_fnameescape(s, FALSE); + if (p != NULL) + { + ga_concat(&ga, p); + ga_concat(&ga, (char_u *)" "); + vim_free(p); + } + s = e + 1; + } + vim_free(str); clear_tv(tv); tv->v_type = VAR_STRING; - tv->vval.v_string = str; - // TODO: escaping - while ((p = vim_strchr(str, '\n')) != NULL) - *p = ' '; + tv->vval.v_string = ga.ga_data; return OK; } // FALLTHROUGH