diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-03-21 19:29:26 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-03-21 19:29:26 +0100 |
commit | b2964f2570574b4c66f3645d69956fec99f2af3e (patch) | |
tree | 931053bca6d081b52f446469f3faa2c07371a781 | |
parent | 3c2881dc1195f53ebafc387378399ddd6cb677a7 (diff) | |
download | vim-b2964f2570574b4c66f3645d69956fec99f2af3e.zip |
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)
-rw-r--r-- | runtime/doc/os_win32.txt | 17 | ||||
-rw-r--r-- | src/os_win32.c | 27 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 42 insertions, 4 deletions
diff --git a/runtime/doc/os_win32.txt b/runtime/doc/os_win32.txt index 735754282..663087b96 100644 --- a/runtime/doc/os_win32.txt +++ b/runtime/doc/os_win32.txt @@ -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. *:!start* -Q. How can I run an external command or program asynchronously? -A. When using :! to run an external command, you can run it with "start": > - :!start winfile.exe<CR> -< Using "start" stops Vim switching to another screen, opening a new console, +Q. How can I asynchronously run an external command or program, or open a + document or URL with its default program? +A. When using :! to run an external command, you can run it with "start". For + 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 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 edd38e3a9..f2fd808e9 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,9 @@ 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; diff --git a/src/version.c b/src/version.c index c3a4779d7..a1edd07d7 100644 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 501, +/**/ 500, /**/ 499, |