# HG changeset patch # User Bram Moolenaar # Date 1622906106 -7200 # Node ID 28127371aa1890447ccf30d82104a5e667decfaa # Parent f31e7022526e161ed0a43378243f531603c79178 patch 8.2.2941: Vim9: using does not handle a list of strings Commit: https://github.com/vim/vim/commit/b288ba9f1dd29ba34f236e3099f779d5ab130227 Author: Bram Moolenaar Date: Sat Jun 5 17:10:55 2021 +0200 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 https://github.com/vim/vim/issues/8310) diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim --- 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 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2941, +/**/ 2940, /**/ 2939, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -999,15 +999,34 @@ do_2string(typval_T *tv, int is_2string_ 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