Mercurial > vim
changeset 25715:454cbc872368 v8.2.3393
patch 8.2.3393: escaping for fish shell is skipping some characters
Commit: https://github.com/vim/vim/commit/6631597452d4644f485a09e4036d117e5f91de70
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 01 Sep 2021 14:45:04 +0200 |
parents | e62b87048b17 |
children | 8515c64f17a1 |
files | src/strings.c src/testdir/test_shell.vim src/version.c |
diffstat | 3 files changed, 13 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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])