]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.203 v7.3.203
authorBram Moolenaar <Bram@vim.org>
Wed, 25 May 2011 15:06:22 +0000 (17:06 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 25 May 2011 15:06:22 +0000 (17:06 +0200)
Problem:    MS-Windows: Can't run an external command without a console window.
Solution:   Support ":!start /b cmd". (Xaizek)

runtime/doc/os_win32.txt
src/os_win32.c
src/version.c

index 9557f2e9572d714634489e7aad851a05b07bbc3e..7f224f82af033fb570ce4e2539705aa481db71ce 100644 (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!
index 179ee64ad9bfbdf7142bd139c64a231c700a581e..d4ef93988b892d040d0ff4dcb0ccc641cfbd00e2 100644 (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);
index a85d4de64d90e716469ca251ddb35aeef8e7b4d3..d8811b268eae86bcb0640a73053de1cf1f889708 100644 (file)
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    203,
 /**/
     202,
 /**/