diff --git a/runtime/doc/os_win32.txt b/runtime/doc/os_win32.txt index 7357542828d952..4c37c3e08d9f4d 100644 --- a/runtime/doc/os_win32.txt +++ b/runtime/doc/os_win32.txt @@ -1,4 +1,4 @@ -*os_win32.txt* For Vim version 8.0. Last change: 2016 Oct 12 +*os_win32.txt* For Vim version 8.0. Last change: 2017 Mar 19 VIM REFERENCE MANUAL by George Reilly @@ -212,10 +212,18 @@ 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. *:!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 + document or URL with default program? A. When using :! to run an external command, you can run it with "start": > - :!start winfile.exe -< Using "start" stops Vim switching to another screen, opening a new console, + :!start notepad + :!start image.jpg + :!start %:h + :!start http://www.vim.org/ +< The first command runs notepad, the second one opens image.jpg with default + image viewer, the third one opens current folder with Windows Explorer, the + forth one opens Vim home page with default browser. + + 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 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 diff --git a/src/os_win32.c b/src/os_win32.c index edd38e3a9ed415..62a0c9a51ab10f 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -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) /* @@ -4711,6 +4733,7 @@ mch_call_shell( STARTUPINFO si; PROCESS_INFORMATION pi; DWORD flags = CREATE_NEW_CONSOLE; + INT n_show_cmd = SW_SHOWNORMAL; char_u *p; ZeroMemory(&si, sizeof(si)); @@ -4729,6 +4752,7 @@ mch_call_shell( cmdbase = skipwhite(cmdbase + 4); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWMINNOACTIVE; + n_show_cmd = SW_SHOWMINNOACTIVE; } else if ((STRNICMP(cmdbase, "/b", 2) == 0) && VIM_ISWHITE(cmdbase[2])) @@ -4800,6 +4824,8 @@ mch_call_shell( */ if (vim_create_process((char *)newcmd, FALSE, flags, &si, &pi)) x = 0; + else if (vim_shell_execute((char *)newcmd, n_show_cmd) > (HINSTANCE)32) + x = 0; else { x = -1;