changeset 24806:28127371aa18 v8.2.2941

patch 8.2.2941: Vim9: using does not handle a list of strings Commit: https://github.com/vim/vim/commit/b288ba9f1dd29ba34f236e3099f779d5ab130227 Author: Bram Moolenaar <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 05 Jun 2021 17:15:06 +0200
parents f31e7022526e
children e651d1ef23b5
files src/testdir/test_vim9_cmd.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 31 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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()
--- 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,
--- 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