# HG changeset patch # User Christian Brabandt # Date 1496682003 -7200 # Node ID 3933a3bf93854d3c0a74e4c80875fe5ebd3251c6 # Parent da4f632c7b6b2347f8e6b981f0fd99cbd5875cd1 patch 8.0.0625: shellescape() always escapes a newline commit https://github.com/vim/vim/commit/206155280def51160a9d81d983aed639015ffb44 Author: Bram Moolenaar Date: Mon Jun 5 18:46:26 2017 +0200 patch 8.0.0625: shellescape() always escapes a newline Problem: shellescape() always escapes a newline, which does not work with some shells. (Harm te Hennepe) Solution: Only escape a newline when the "special" argument is non-zero. (Christian Brabandt, closes #1590) diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -10461,8 +10461,10 @@ f_sha256(typval_T *argvars, typval_T *re static void f_shellescape(typval_T *argvars, typval_T *rettv) { + int do_special = non_zero_arg(&argvars[1]); + rettv->vval.v_string = vim_strsave_shellescape( - get_tv_string(&argvars[0]), non_zero_arg(&argvars[1]), TRUE); + get_tv_string(&argvars[0]), do_special, do_special); rettv->v_type = VAR_STRING; } diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -784,3 +784,28 @@ func Test_redo_in_nested_functions() delfunc Operator delfunc Apply endfunc + +func Test_shellescape() + let save_shell = &shell + set shell=bash + 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\nxt'", shellescape("te\nxt")) + call assert_equal("'te\\\nxt'", shellescape("te\nxt", 1)) + set shell=tcsh + call assert_equal("'te\\!xt'", shellescape("te!xt")) + call assert_equal("'te\\\\!xt'", shellescape("te!xt", 1)) + call assert_equal("'te\\\nxt'", shellescape("te\nxt")) + call assert_equal("'te\\\\\nxt'", shellescape("te\nxt", 1)) + + let &shell = save_shell +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 625, +/**/ 624, /**/ 623,