Skip to content

Commit

Permalink
patch 8.0.0501: on MS-Windows ":!start" does not work as expected
Browse files Browse the repository at this point in the history
Problem:    On MS-Windows ":!start" does not work as expected.
Solution:   When creating a process fails try passing the argument to
            ShellExecute().  (Katsuya Hino, closes #1570)
  • Loading branch information
brammool committed Mar 21, 2017
1 parent 3c2881d commit b2964f2
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 4 deletions.
17 changes: 13 additions & 4 deletions runtime/doc/os_win32.txt
Expand Up @@ -212,10 +212,19 @@ A. You can't! This is a limitation of the NT console. NT 5.0 is reported to
be able to set the blink rate for all console windows at the same time. be able to set the blink rate for all console windows at the same time.


*:!start* *:!start*
Q. How can I run an external command or program asynchronously? Q. How can I asynchronously run an external command or program, or open a
A. When using :! to run an external command, you can run it with "start": > document or URL with its default program?
:!start winfile.exe<CR> A. When using :! to run an external command, you can run it with "start". For
< Using "start" stops Vim switching to another screen, opening a new console, example, to run notepad: >
:!start notepad
< To open "image.jpg" with the default image viewer: >
:!start image.jpg
< To open the folder of the current file in Windows Explorer: >
:!start %:h
< To open the Vim home page with the default browser: >
:!start http://www.vim.org/
<
Using "start" stops Vim switching to another screen, opening a new console,
or waiting for the program to complete; it indicates that you are running a or waiting for the program to complete; it indicates that you are running a
program that does not affect the files you are editing. Programs begun program that does not affect the files you are editing. Programs begun
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
Expand Down
27 changes: 27 additions & 0 deletions src/os_win32.c
Expand Up @@ -4008,6 +4008,28 @@ vim_create_process(
} }




static HINSTANCE
vim_shell_execute(
char *cmd,
INT n_show_cmd)
{
#ifdef FEAT_MBYTE
if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
{
WCHAR *wcmd = enc_to_utf16((char_u *)cmd, NULL);
if (wcmd != NULL)
{
HINSTANCE ret;
ret = ShellExecuteW(NULL, NULL, wcmd, NULL, NULL, n_show_cmd);
vim_free(wcmd);
return ret;
}
}
#endif
return ShellExecute(NULL, NULL, cmd, NULL, NULL, n_show_cmd);
}


#if defined(FEAT_GUI_W32) || defined(PROTO) #if defined(FEAT_GUI_W32) || defined(PROTO)


/* /*
Expand Down Expand Up @@ -4711,6 +4733,7 @@ mch_call_shell(
STARTUPINFO si; STARTUPINFO si;
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
DWORD flags = CREATE_NEW_CONSOLE; DWORD flags = CREATE_NEW_CONSOLE;
INT n_show_cmd = SW_SHOWNORMAL;
char_u *p; char_u *p;


ZeroMemory(&si, sizeof(si)); ZeroMemory(&si, sizeof(si));
Expand All @@ -4729,6 +4752,7 @@ mch_call_shell(
cmdbase = skipwhite(cmdbase + 4); cmdbase = skipwhite(cmdbase + 4);
si.dwFlags = STARTF_USESHOWWINDOW; si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWMINNOACTIVE; si.wShowWindow = SW_SHOWMINNOACTIVE;
n_show_cmd = SW_SHOWMINNOACTIVE;
} }
else if ((STRNICMP(cmdbase, "/b", 2) == 0) else if ((STRNICMP(cmdbase, "/b", 2) == 0)
&& VIM_ISWHITE(cmdbase[2])) && VIM_ISWHITE(cmdbase[2]))
Expand Down Expand Up @@ -4800,6 +4824,9 @@ mch_call_shell(
*/ */
if (vim_create_process((char *)newcmd, FALSE, flags, &si, &pi)) if (vim_create_process((char *)newcmd, FALSE, flags, &si, &pi))
x = 0; x = 0;
else if (vim_shell_execute((char *)newcmd, n_show_cmd)
> (HINSTANCE)32)
x = 0;
else else
{ {
x = -1; x = -1;
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -764,6 +764,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 */
/**/
501,
/**/ /**/
500, 500,
/**/ /**/
Expand Down

0 comments on commit b2964f2

Please sign in to comment.