Created
February 22, 2012 13:00
-
-
Save mattn/1885042 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -r dd78da101764 src/os_win32.c | |
--- a/src/os_win32.c Tue Feb 21 21:22:45 2012 +0100 | |
+++ b/src/os_win32.c Wed Feb 22 22:00:04 2012 +0900 | |
@@ -3933,7 +3933,9 @@ | |
else | |
{ | |
/* we use "command" or "cmd" to start the shell; slow but easy */ | |
- char_u *cmdbase = cmd; | |
+ char_u *newcmd = NULL; | |
+ char_u *cmdbase = cmd; | |
+ long_u cmdlen; | |
/* Skip a leading ", ( and "(. */ | |
if (*cmdbase == '"' ) | |
@@ -3993,12 +3995,37 @@ | |
*--p = NUL; | |
} | |
+ newcmd = cmdbase; | |
+ unescape_shellxquote(cmdbase, p_sxe); | |
/* | |
- * Unescape characters in shellxescape. This is workaround for | |
- * /b option. Only redirect character should be unescaped. | |
+ * If creating new console, arguments are passed to the | |
+ * 'cmd.exe' as it is. If it's not, arguments are not treated | |
+ * correctly for current 'cmd.exe'. So unescape characters in | |
+ * shellxescape except '|' for avoiding to be treated as | |
+ * argument to them. Pass the arguments to sub-shell. | |
*/ | |
- unescape_shellxquote(cmdbase, | |
- (flags & CREATE_NEW_CONSOLE) ? p_sxe : "<>"); | |
+ if ((flags & CREATE_NEW_CONSOLE) == 0) | |
+ { | |
+ char_u *subcmd; | |
+ char_u *cmd_shell = mch_getenv("COMSPEC"); | |
+ if (cmd_shell == NULL) | |
+ cmd_shell = default_shell(); | |
+ | |
+ subcmd = vim_strsave_escaped_ext(cmdbase, "|", '^', FALSE); | |
+ if (subcmd != NULL) | |
+ { | |
+ /* make "cmd.exe /c arguments" */ | |
+ cmdlen = STRLEN(cmd_shell) + STRLEN(subcmd) + 5; | |
+ | |
+ newcmd = lalloc(cmdlen, TRUE); | |
+ if (newcmd) | |
+ vim_snprintf((char *)newcmd, cmdlen, "%s /c %s", | |
+ cmd_shell, subcmd); | |
+ else | |
+ newcmd = cmdbase; | |
+ vim_free(subcmd); | |
+ } | |
+ } | |
/* | |
* Now, start the command as a process, so that it doesn't | |
@@ -4006,7 +4033,7 @@ | |
* files if we exit before the spawned process | |
*/ | |
if (CreateProcess(NULL, // Executable name | |
- cmdbase, // Command to execute | |
+ newcmd, // Command to execute | |
NULL, // Process security attributes | |
NULL, // Thread security attributes | |
FALSE, // Inherit handles | |
@@ -4023,6 +4050,10 @@ | |
EMSG(_("E371: Command not found")); | |
#endif | |
} | |
+ | |
+ if (newcmd != cmdbase) | |
+ vim_free(newcmd); | |
+ | |
if (si.hStdInput != NULL) | |
{ | |
/* Close the handle to \\.\NUL */ | |
@@ -4034,8 +4065,7 @@ | |
} | |
else | |
{ | |
- char_u *newcmd; | |
- long_u cmdlen = ( | |
+ cmdlen = ( | |
#ifdef FEAT_GUI_W32 | |
(allowPiping && !p_stmp ? 0 : STRLEN(vimrun_path)) + | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment