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:
@@ -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
|
with :!start do not get passed Vim's open file handles, which means they do
|
||||||
not have to be closed before Vim.
|
not have to be closed before Vim.
|
||||||
To avoid this special treatment, use ":! start".
|
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",
|
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!
|
Vim doesn't wait for it to finish! Help!
|
||||||
|
@@ -3401,6 +3401,7 @@ mch_call_shell(
|
|||||||
{
|
{
|
||||||
STARTUPINFO si;
|
STARTUPINFO si;
|
||||||
PROCESS_INFORMATION pi;
|
PROCESS_INFORMATION pi;
|
||||||
|
DWORD flags = CREATE_NEW_CONSOLE;
|
||||||
|
|
||||||
si.cb = sizeof(si);
|
si.cb = sizeof(si);
|
||||||
si.lpReserved = NULL;
|
si.lpReserved = NULL;
|
||||||
@@ -3418,6 +3419,22 @@ mch_call_shell(
|
|||||||
si.dwFlags = STARTF_USESHOWWINDOW;
|
si.dwFlags = STARTF_USESHOWWINDOW;
|
||||||
si.wShowWindow = SW_SHOWMINNOACTIVE;
|
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
|
/* When the command is in double quotes, but 'shellxquote' is
|
||||||
* empty, keep the double quotes around the command.
|
* empty, keep the double quotes around the command.
|
||||||
@@ -3445,7 +3462,7 @@ mch_call_shell(
|
|||||||
NULL, // Process security attributes
|
NULL, // Process security attributes
|
||||||
NULL, // Thread security attributes
|
NULL, // Thread security attributes
|
||||||
FALSE, // Inherit handles
|
FALSE, // Inherit handles
|
||||||
CREATE_NEW_CONSOLE, // Creation flags
|
flags, // Creation flags
|
||||||
NULL, // Environment
|
NULL, // Environment
|
||||||
NULL, // Current directory
|
NULL, // Current directory
|
||||||
&si, // Startup information
|
&si, // Startup information
|
||||||
@@ -3458,6 +3475,11 @@ mch_call_shell(
|
|||||||
EMSG(_("E371: Command not found"));
|
EMSG(_("E371: Command not found"));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
if (si.hStdInput != NULL)
|
||||||
|
{
|
||||||
|
/* Close the handle to \\.\NUL */
|
||||||
|
CloseHandle(si.hStdInput);
|
||||||
|
}
|
||||||
/* Close the handles to the subprocess, so that it goes away */
|
/* Close the handles to the subprocess, so that it goes away */
|
||||||
CloseHandle(pi.hThread);
|
CloseHandle(pi.hThread);
|
||||||
CloseHandle(pi.hProcess);
|
CloseHandle(pi.hProcess);
|
||||||
|
@@ -709,6 +709,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
203,
|
||||||
/**/
|
/**/
|
||||||
202,
|
202,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user