1
0
forked from aniani/vim

patch 8.0.0501: on MS-Windows ":!start" does not work as expected

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)
This commit is contained in:
Bram Moolenaar
2017-03-21 19:29:26 +01:00
parent 3c2881dc11
commit b2964f2570
3 changed files with 42 additions and 4 deletions

View File

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

View File

@@ -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)
/* /*
@@ -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));
@@ -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]))
@@ -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;

View File

@@ -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,
/**/ /**/