summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-03-21 19:29:26 +0100
committerBram Moolenaar <Bram@vim.org>2017-03-21 19:29:26 +0100
commitb2964f2570574b4c66f3645d69956fec99f2af3e (patch)
tree931053bca6d081b52f446469f3faa2c07371a781
parent3c2881dc1195f53ebafc387378399ddd6cb677a7 (diff)
downloadvim-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.txt17
-rw-r--r--src/os_win32.c27
-rw-r--r--src/version.c2
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,