Mercurial > vim
changeset 1673:553c97222cc0 v7.2b.005
updated for version 7.2b-005
author | vimboss |
---|---|
date | Wed, 16 Jul 2008 20:43:37 +0000 |
parents | fddea6c03dee |
children | 1d7f46148bf4 |
files | src/misc2.c src/version.c |
diffstat | 2 files changed, 26 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/misc2.c +++ b/src/misc2.c @@ -1262,7 +1262,9 @@ vim_strsave_escaped_ext(string, esc_char * Escape "string" for use as a shell argument with system(). * This uses single quotes, except when we know we need to use double qoutes * (MS-DOS and MS-Windows without 'shellslash' set). - * Also replace "%", "#" and things like "<cfile>" when "do_special" is TRUE. + * Escape a newline, depending on the 'shell' option. + * When "do_special" is TRUE also replace "!", "%", "#" and things starting + * with "<" like "<cfile>". * Returns the result in allocated memory, NULL if we have run out. */ char_u * @@ -1275,6 +1277,13 @@ vim_strsave_shellescape(string, do_speci char_u *d; char_u *escaped_string; int l; + int csh_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 + * literally. If do_special is set the '!' will be escaped twice. + * Csh also needs to have "\n" escaped twice when do_special is set. */ + csh_like = (strstr((char *)gettail(p_sh), "csh") != NULL); /* First count the number of extra bytes required. */ length = (unsigned)STRLEN(string) + 3; /* two quotes and a trailing NUL */ @@ -1290,6 +1299,12 @@ vim_strsave_shellescape(string, do_speci # endif if (*p == '\'') length += 3; /* ' => '\'' */ + if (*p == '\n' || (*p == '!' && (csh_like || do_special))) + { + ++length; /* insert backslash */ + if (csh_like && do_special) + ++length; /* insert backslash */ + } if (do_special && find_cmdline_var(p, &l) >= 0) { ++length; /* insert backslash */ @@ -1335,6 +1350,14 @@ vim_strsave_shellescape(string, do_speci ++p; continue; } + if (*p == '\n' || (*p == '!' && (csh_like || do_special))) + { + *d++ = '\\'; + if (csh_like && do_special) + *d++ = '\\'; + *d++ = *p++; + continue; + } if (do_special && find_cmdline_var(p, &l) >= 0) { *d++ = '\\'; /* insert backslash */