Skip to content

Instantly share code, notes, and snippets.

@mattn
Created February 22, 2012 13:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattn/1885042 to your computer and use it in GitHub Desktop.
Save mattn/1885042 to your computer and use it in GitHub Desktop.
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