Blob Blame History Raw
To: vim_dev@googlegroups.com
Subject: Patch 7.3.203
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 7.3.203
Problem:    MS-Windows: Can't run an external command without a console window.
Solution:   Support ":!start /b cmd". (Xaizek)
Files:	    runtime/doc/os_win32.txt, src/os_win32.c


*** ../mercurial/vim73/runtime/doc/os_win32.txt	2011-01-08 16:05:50.000000000 +0100
--- runtime/doc/os_win32.txt	2011-05-25 17:04:58.000000000 +0200
***************
*** 313,319 ****
     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.
  
  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!
--- 313,348 ----
     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".
!    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!
*** ../mercurial/vim73/src/os_win32.c	2011-05-05 18:31:54.000000000 +0200
--- src/os_win32.c	2011-05-25 16:45:31.000000000 +0200
***************
*** 3401,3406 ****
--- 3401,3407 ----
  	    {
  		STARTUPINFO		si;
  		PROCESS_INFORMATION	pi;
+ 		DWORD			flags = CREATE_NEW_CONSOLE;
  
  		si.cb = sizeof(si);
  		si.lpReserved = NULL;
***************
*** 3418,3423 ****
--- 3419,3440 ----
  		    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,3451 ****
  			NULL,			// Process security attributes
  			NULL,			// Thread security attributes
  			FALSE,			// Inherit handles
! 			CREATE_NEW_CONSOLE,	// Creation flags
  			NULL,			// Environment
  			NULL,			// Current directory
  			&si,			// Startup information
--- 3462,3468 ----
  			NULL,			// Process security attributes
  			NULL,			// Thread security attributes
  			FALSE,			// Inherit handles
! 			flags,			// Creation flags
  			NULL,			// Environment
  			NULL,			// Current directory
  			&si,			// Startup information
***************
*** 3458,3463 ****
--- 3475,3485 ----
  		    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);
*** ../vim-7.3.202/src/version.c	2011-05-25 15:16:06.000000000 +0200
--- src/version.c	2011-05-25 17:05:59.000000000 +0200
***************
*** 711,712 ****
--- 711,714 ----
  {   /* Add new patch number below this line */
+ /**/
+     203,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
108. While reading a magazine, you look for the Zoom icon for a better
     look at a photograph.

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///