# HG changeset patch # User Bram Moolenaar # Date 1630500304 -7200 # Node ID 454cbc87236846bf72f59dd3d6c6e4c7e883178d # Parent e62b87048b17d19b8140f6a01d1f1c0b94b0a870 patch 8.2.3393: escaping for fish shell is skipping some characters Commit: https://github.com/vim/vim/commit/6631597452d4644f485a09e4036d117e5f91de70 Author: Bram Moolenaar Date: Wed Sep 1 14:31:51 2021 +0200 patch 8.2.3393: escaping for fish shell is skipping some characters Problem: Escaping for fish shell is skipping some characters. Solution: Escape character after backslash if needed. (Jason Cox, closes #8827) diff --git a/src/strings.c b/src/strings.c --- a/src/strings.c +++ b/src/strings.c @@ -281,6 +281,7 @@ vim_strsave_shellescape(char_u *string, { *d++ = '\\'; *d++ = *p++; + continue; } MB_COPY_CHAR(p, d); diff --git a/src/testdir/test_shell.vim b/src/testdir/test_shell.vim --- a/src/testdir/test_shell.vim +++ b/src/testdir/test_shell.vim @@ -61,21 +61,21 @@ func Test_shell_options() for e in shells exe 'set shell=' .. e[0] if e[0] =~# '.*csh$' || e[0] =~# '.*csh.exe$' - let str1 = "'cmd \"arg1\" '\\''arg2'\\'' \\!%# \\'" - let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\\\!\\%\\# \\'" + let str1 = "'cmd \"arg1\" '\\''arg2'\\'' \\!%# \\'\\'' \\\\! \\% \\#'" + let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\\\!\\%\\# \\'\\'' \\\\\\! \\\\% \\\\#'" elseif e[0] =~# '.*powershell$' || e[0] =~# '.*powershell.exe$' \ || e[0] =~# '.*pwsh$' || e[0] =~# '.*pwsh.exe$' - let str1 = "'cmd \"arg1\" ''arg2'' !%# \\'" - let str2 = "'cmd \"arg1\" ''arg2'' \\!\\%\\# \\'" + let str1 = "'cmd \"arg1\" ''arg2'' !%# \\'' \\! \\% \\#'" + let str2 = "'cmd \"arg1\" ''arg2'' \\!\\%\\# \\'' \\\\! \\\\% \\\\#'" elseif e[0] =~# '.*fish$' || e[0] =~# '.*fish.exe$' - let str1 = "'cmd \"arg1\" '\\''arg2'\\'' !%# \\\\'" - let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\!\\%\\# \\\\'" + let str1 = "'cmd \"arg1\" '\\''arg2'\\'' !%# \\\\'\\'' \\\\! \\\\% \\\\#'" + let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\!\\%\\# \\\\'\\'' \\\\\\! \\\\\\% \\\\\\#'" else - let str1 = "'cmd \"arg1\" '\\''arg2'\\'' !%# \\'" - let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\!\\%\\# \\'" + let str1 = "'cmd \"arg1\" '\\''arg2'\\'' !%# \\'\\'' \\! \\% \\#'" + let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\!\\%\\# \\'\\'' \\\\! \\\\% \\\\#'" endif - call assert_equal(str1, shellescape("cmd \"arg1\" 'arg2' !%# \\"), e[0]) - call assert_equal(str2, shellescape("cmd \"arg1\" 'arg2' !%# \\", 1), e[0]) + call assert_equal(str1, shellescape("cmd \"arg1\" 'arg2' !%# \\' \\! \\% \\#"), e[0]) + call assert_equal(str2, shellescape("cmd \"arg1\" 'arg2' !%# \\' \\! \\% \\#", 1), e[0]) " Try running an external command with the shell. if executable(e[0]) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3393, +/**/ 3392, /**/ 3391,