changeset 2859:ce1dce2af2a3 v7.3.203

updated for version 7.3.203 Problem: MS-Windows: Can't run an external command without a console window. Solution: Support ":!start /b cmd". (Xaizek)
author Bram Moolenaar <bram@vim.org>
date Wed, 25 May 2011 17:06:22 +0200
parents 1183ac834d90
children 7b2059f583c8
files runtime/doc/os_win32.txt src/os_win32.c src/version.c
diffstat 3 files changed, 55 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/os_win32.txt
+++ b/runtime/doc/os_win32.txt
@@ -313,7 +313,36 @@ A. When using :! to run an external comm
    with :!start do not get passed Vim's open file handles, which means they do
    not have to be closed before Vim.
    To avoid this special treatment, use ":! start".
-   The optional "/min" argument causes the window to be minimized.
+   There are two optional arguments (see the next Q):
+       /min  the window will be minimized.
+       /b"   no console window will be opened
+   You can only one of these flags at a time.  A second second one will be
+   treated as the start of the command.
+
+Q. How do I avoid getting a window for programs that I run asynchronously?
+A. You have two possible solutions depending on what exactly do you want:
+   1) You may use the /min flag that would run program in minimized state with
+      no other changes. It will work equally for console and GUI applications.
+   2) You can use /b flag to run console applications without creating a
+      console window for them (GUI applications are not affected). But you
+      should use this flag only if application you run doesn't require any
+      input.  Otherwise it will get an EOF error because it's input stream
+      (stdin) would be redirected to \\.\NUL (stdour and stderr too).
+
+   Example for a console application, run Exuberant ctags: >
+        :!start /min ctags -R .
+<  When it has finished you should see file named "tags" in your current
+   directory.  You should notice the window title blinking on your taskbar.
+   This is more noticable for commands that take longer.
+   Now delete the "tags" file and run this command: >
+        :!start /b ctags -R .
+<  You should have the same "tags" file, but this time there will be no
+   blinking on the taskbar.
+   Example for a GUI application: >
+        :!start /min notepad
+        :!start /b notepad
+<  The first command runs notepad minimized and the second one runs it
+   normally.
 
 Q. I'm using Win32s, and when I try to run an external command like "make",
    Vim doesn't wait for it to finish!  Help!
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -3401,6 +3401,7 @@ mch_call_shell(
 	    {
 		STARTUPINFO		si;
 		PROCESS_INFORMATION	pi;
+		DWORD			flags = CREATE_NEW_CONSOLE;
 
 		si.cb = sizeof(si);
 		si.lpReserved = NULL;
@@ -3418,6 +3419,22 @@ mch_call_shell(
 		    si.dwFlags = STARTF_USESHOWWINDOW;
 		    si.wShowWindow = SW_SHOWMINNOACTIVE;
 		}
+		else if ((STRNICMP(cmdbase, "/b", 2) == 0)
+			&& vim_iswhite(cmdbase[2]))
+		{
+		    cmdbase = skipwhite(cmdbase + 2);
+		    flags = CREATE_NO_WINDOW;
+		    si.dwFlags = STARTF_USESTDHANDLES;
+		    si.hStdInput = CreateFile("\\\\.\\NUL",	// File name
+			GENERIC_READ,				// Access flags
+			0,					// Share flags
+			NULL,					// Security att.
+			OPEN_EXISTING,				// Open flags
+			FILE_ATTRIBUTE_NORMAL,			// File att.
+			NULL);					// Temp file
+		    si.hStdOutput = si.hStdInput;
+		    si.hStdError = si.hStdInput;
+		}
 
 		/* When the command is in double quotes, but 'shellxquote' is
 		 * empty, keep the double quotes around the command.
@@ -3445,7 +3462,7 @@ mch_call_shell(
 			NULL,			// Process security attributes
 			NULL,			// Thread security attributes
 			FALSE,			// Inherit handles
-			CREATE_NEW_CONSOLE,	// Creation flags
+			flags,			// Creation flags
 			NULL,			// Environment
 			NULL,			// Current directory
 			&si,			// Startup information
@@ -3458,6 +3475,11 @@ mch_call_shell(
 		    EMSG(_("E371: Command not found"));
 #endif
 		}
+		if (si.hStdInput != NULL)
+		{
+		    /* Close the handle to \\.\NUL */
+		    CloseHandle(si.hStdInput);
+		}
 		/* Close the handles to the subprocess, so that it goes away */
 		CloseHandle(pi.hThread);
 		CloseHandle(pi.hProcess);
--- a/src/version.c
+++ b/src/version.c
@@ -710,6 +710,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    203,
+/**/
     202,
 /**/
     201,