Mercurial > vim
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