diff options
author | Bram Moolenaar <Bram@vim.org> | 2012-02-19 18:19:30 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2012-02-19 18:19:30 +0100 |
commit | 034b115568a1fc40b374b0b755d89f0a40f6d940 (patch) | |
tree | b2e6a8d5cd41cfe50311996e1fb8e6935981a5c8 /src | |
parent | 5dc6252d331013e397a8d71e8f7ee9fd1cf514c1 (diff) | |
download | vim-034b115568a1fc40b374b0b755d89f0a40f6d940.zip |
updated for version 7.3.445
Problem: Can't properly escape commands for cmd.exe.
Solution: Default 'shellxquote' to '('. Append ')' to make '(command)'.
No need to use "/s" for 'shellcmdflag'.
Diffstat (limited to 'src')
-rw-r--r-- | src/misc2.c | 6 | ||||
-rw-r--r-- | src/option.c | 17 | ||||
-rw-r--r-- | src/os_win32.c | 37 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 39 insertions, 23 deletions
diff --git a/src/misc2.c b/src/misc2.c index 00d1ff4a0..fc38cd029 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -3230,7 +3230,11 @@ call_shell(cmd, opt) { STRCPY(ncmd, p_sxq); STRCAT(ncmd, cmd); - STRCAT(ncmd, p_sxq); + /* When 'shellxquote' is ( append ). + * When 'shellxquote' is "( append )". */ + STRCAT(ncmd, STRCMP(p_sxq, "(") == 0 ? (char_u *)")" + : STRCMP(p_sxq, "\"(") == 0 ? (char_u *)")\"" + : p_sxq); retval = mch_call_shell(ncmd, opt); vim_free(ncmd); } diff --git a/src/option.c b/src/option.c index 04db07b9f..cac031e18 100644 --- a/src/option.c +++ b/src/option.c @@ -3933,27 +3933,22 @@ set_init_3() * my path/to/echo" "my args to echo * when executed. * - * To avoid this, use the /s argument in addition to /c to force the - * stripping behavior, and also set shellxquote to automatically - * surround the entire command in quotes (which get stripped as - * noted). + * To avoid this, set shellxquote to surround the command in + * parenthesis. This appears to make most commands work, without + * breaking commands that worked previously, such as + * '"path with spaces/cmd" "a&b"'. */ - - /* Set shellxquote default to add the quotes to be stripped. */ idx3 = findoption((char_u *)"sxq"); if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) { - p_sxq = (char_u *)"\""; + p_sxq = (char_u *)"("; options[idx3].def_val[VI_DEFAULT] = p_sxq; } - /* Set shellcmdflag default to always strip the quotes, note the order - * between /s and /c is important or cmd.exe will treat the /s as part - * of the command to be executed. */ idx3 = findoption((char_u *)"shcf"); if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) { - p_shcf = (char_u *)"/s /c"; + p_shcf = (char_u *)"/c"; options[idx3].def_val[VI_DEFAULT] = p_shcf; } } diff --git a/src/os_win32.c b/src/os_win32.c index fbf077f6f..520a09544 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -3908,8 +3908,13 @@ mch_call_shell( newcmd = lalloc(cmdlen, TRUE); if (newcmd != NULL) { - char_u *cmdbase = (*cmd == '"' ? cmd + 1 : cmd); + char_u *cmdbase = cmd; + /* Skip a leading ", ( and "(. */ + if (*cmdbase == '"' ) + ++cmdbase; + if (*cmdbase == '(') + ++cmdbase; if ((STRNICMP(cmdbase, "start", 5) == 0) && vim_iswhite(cmdbase[5])) { STARTUPINFO si; @@ -3953,16 +3958,26 @@ mch_call_shell( * empty, keep the double quotes around the command. * Otherwise remove the double quotes, they aren't needed * here, because we don't use a shell to run the command. */ - if (*cmd == '"' && *p_sxq == NUL) + if (cmdbase > cmd) { - newcmd[0] = '"'; - STRCPY(newcmd + 1, cmdbase); - } - else - { - STRCPY(newcmd, cmdbase); - if (*cmd == '"' && *newcmd != NUL) - newcmd[STRLEN(newcmd) - 1] = NUL; + if (STRNCMP(cmd, p_sxq, cmd - cmdbase) != 0) + { + STRCPY(newcmd, cmd); + } + else + { + char_u *p; + + STRCPY(newcmd, cmdbase); + /* Remove a trailing ", ) and )" if they have a match + * at the start of the command. */ + p = newcmd + STRLEN(newcmd); + if (p > newcmd && p[-1] == '"' && *cmd == '"') + *--p = NUL; + if (p > newcmd && p[-1] == ')' + && (*cmd =='(' || cmd[1] == '(')) + *--p = NUL; + } } /* @@ -3970,7 +3985,7 @@ mch_call_shell( * inherit our handles which causes unpleasant dangling swap * files if we exit before the spawned process */ - if (CreateProcess (NULL, // Executable name + if (CreateProcess(NULL, // Executable name newcmd, // Command to execute NULL, // Process security attributes NULL, // Thread security attributes diff --git a/src/version.c b/src/version.c index bf32d28d7..7b78a45a0 100644 --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 445, +/**/ 444, /**/ 443, |