diff options
author | Jason Cox <dev@jasoncarloscox.com> | 2021-08-31 20:16:03 -0600 |
---|---|---|
committer | Jason Cox <dev@jasoncarloscox.com> | 2021-09-02 13:07:29 -0600 |
commit | 85ba41a4b343d0a8fe6d3d5af90a74640220f5cb (patch) | |
tree | 9dc771a9bb0b9f845ea9c03c6622265cf8f1e1d4 /src | |
parent | 284199bc4bf36bb74c481da9c8b2a43c1bbbeb51 (diff) | |
download | rneovim-85ba41a4b343d0a8fe6d3d5af90a74640220f5cb.tar.gz rneovim-85ba41a4b343d0a8fe6d3d5af90a74640220f5cb.tar.bz2 rneovim-85ba41a4b343d0a8fe6d3d5af90a74640220f5cb.zip |
vim-patch:8.2.3385: escaping for fish shell does not work properly
Problem: Escaping for fish shell does not work properly.
Solution: Insert a backslash before a backslash. (Jason Cox, closes vim/vim#8810)
https://github.com/vim/vim/commit/6e82351130ddb8d13cf3748b47f07cae77886fc7
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/option.c | 6 | ||||
-rw-r--r-- | src/nvim/strings.c | 12 | ||||
-rw-r--r-- | src/nvim/testdir/test_functions.vim | 15 |
3 files changed, 33 insertions, 0 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c index d11bbc8ecc..fbf19ab9ff 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -7618,6 +7618,12 @@ int csh_like_shell(void) return strstr((char *)path_tail(p_sh), "csh") != NULL; } +/// Return true when 'shell' has "fish" in the tail. +bool fish_like_shell(void) +{ + return strstr((char *)path_tail(p_sh), "fish") != NULL; +} + /// Return the number of requested sign columns, based on current /// buffer signs and on user configuration. int win_signcol_count(win_T *wp) diff --git a/src/nvim/strings.c b/src/nvim/strings.c index 0363afe02d..33310701d5 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -190,6 +190,7 @@ char_u *vim_strsave_shellescape(const char_u *string, char_u *escaped_string; size_t l; int csh_like; + bool fish_like; /* Only csh and similar shells expand '!' within single quotes. For sh and * the like we must not put a backslash before it, it will be taken @@ -197,6 +198,10 @@ char_u *vim_strsave_shellescape(const char_u *string, * Csh also needs to have "\n" escaped twice when do_special is set. */ csh_like = csh_like_shell(); + // Fish shell uses '\' as an escape character within single quotes, so '\' + // itself must be escaped to get a literal '\'. + fish_like = fish_like_shell(); + /* First count the number of extra bytes required. */ size_t length = STRLEN(string) + 3; // two quotes and a trailing NUL for (const char_u *p = string; *p != NUL; MB_PTR_ADV(p)) { @@ -220,6 +225,9 @@ char_u *vim_strsave_shellescape(const char_u *string, ++length; /* insert backslash */ p += l - 1; } + if (*p == '\\' && fish_like) { + length++; // insert backslash + } } /* Allocate memory for the result and fill it. */ @@ -267,6 +275,10 @@ char_u *vim_strsave_shellescape(const char_u *string, *d++ = *p++; continue; } + if (*p == '\\' && fish_like) { + *d++ = '\\'; + *d++ = *p++; + } MB_COPY_CHAR(p, d); } diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim index 6cb3e24201..c964f7aea4 100644 --- a/src/nvim/testdir/test_functions.vim +++ b/src/nvim/testdir/test_functions.vim @@ -1160,6 +1160,21 @@ func Test_shellescape() call assert_equal("'te\\\nxt'", shellescape("te\nxt")) call assert_equal("'te\\\\\nxt'", shellescape("te\nxt", 1)) + set shell=fish + call assert_equal("'text'", shellescape('text')) + call assert_equal("'te\"xt'", shellescape('te"xt')) + call assert_equal("'te'\\''xt'", shellescape("te'xt")) + + call assert_equal("'te%xt'", shellescape("te%xt")) + call assert_equal("'te\\%xt'", shellescape("te%xt", 1)) + call assert_equal("'te#xt'", shellescape("te#xt")) + call assert_equal("'te\\#xt'", shellescape("te#xt", 1)) + call assert_equal("'te!xt'", shellescape("te!xt")) + call assert_equal("'te\\!xt'", shellescape("te!xt", 1)) + + call assert_equal("'te\\\\xt'", shellescape("te\\xt")) + call assert_equal("'te\\\\xt'", shellescape("te\\xt", 1)) + let &shell = save_shell endfunc |