0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

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)
This commit is contained in:
Bram Moolenaar
2011-05-25 17:06:22 +02:00
parent ed38b0ac41
commit bd8608d979
3 changed files with 55 additions and 2 deletions

View File

@@ -313,7 +313,36 @@ A. When using :! to run an external command, you can run it with "start": >
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!

View File

@@ -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);

View File

@@ -709,6 +709,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
203,
/**/
202,
/**/