# HG changeset patch # User Bram Moolenaar # Date 1306335982 -7200 # Node ID ce1dce2af2a34aec196b7fbe29cf8c653b6ec6de # Parent 1183ac834d900fc8523931c03ed0e99d856227d6 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) diff --git a/runtime/doc/os_win32.txt b/runtime/doc/os_win32.txt --- 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! diff --git a/src/os_win32.c b/src/os_win32.c --- 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); diff --git a/src/version.c b/src/version.c --- 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,