summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-11-21 18:11:27 +0100
committerBram Moolenaar <Bram@vim.org>2017-11-21 18:11:27 +0100
commit52dbb5ea7fde4a77178bc59e2383ca40df503812 (patch)
tree15ff54bb446f2595defa95bfcafb6616b8d62aff
parent550586015232ecc4f68b3479fa8ba2cf81c76e7b (diff)
downloadvim-git-52dbb5ea7fde4a77178bc59e2383ca40df503812.tar.gz
patch 8.0.1330: MS-Windows: job in terminal can't get back to Vimv8.0.1330
Problem: MS-Windows: job in terminal can't get back to Vim. Solution: set VIM_SERVERNAME in the environment. (Yasuhiro Matsumoto, closes #2360)
-rw-r--r--runtime/doc/terminal.txt9
-rw-r--r--src/os_win32.c71
-rw-r--r--src/proto/os_win32.pro2
-rw-r--r--src/terminal.c13
-rw-r--r--src/testdir/test_terminal.vim21
-rw-r--r--src/version.c2
6 files changed, 83 insertions, 35 deletions
diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt
index b3df8ce04..2a1972c92 100644
--- a/runtime/doc/terminal.txt
+++ b/runtime/doc/terminal.txt
@@ -1,4 +1,4 @@
-*terminal.txt* For Vim version 8.0. Last change: 2017 Nov 12
+*terminal.txt* For Vim version 8.0. Last change: 2017 Nov 17
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -106,6 +106,10 @@ BufWinEnter autocommand event is triggered. This makes it possible to set
options specifically for the window and buffer. Example: >
au BufWinEnter * if &buftype == 'terminal' | setlocal bufhidden=hide | endif
+Mouse events (click and drag) are passed to the terminal. Mouse move events
+are only passed when Vim itself is receiving them. For a terminal that is
+when 'balloonevalterm' is enabled.
+
Size and color ~
*terminal-size-color*
@@ -335,6 +339,9 @@ to point to the right file, if needed. If you have both the 32-bit and 64-bit
version, rename to winpty32.dll and winpty64.dll to match the way Vim was
build.
+Environment variables are used to pass information to the running job:
+ VIM_SERVERNAME v:servername
+
==============================================================================
2. Remote testing *terminal-testing*
diff --git a/src/os_win32.c b/src/os_win32.c
index 3a2b356b0..becbeeee2 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -5034,10 +5034,10 @@ job_io_file_open(
* environment argument of vim_create_process().
*/
void
-win32_build_env(dict_T *env, garray_T *gap)
+win32_build_env(dict_T *env, garray_T *gap, int is_terminal)
{
hashitem_T *hi;
- int todo = (int)env->dv_hashtab.ht_used;
+ long_u todo = env != NULL ? env->dv_hashtab.ht_used : 0;
LPVOID base = GetEnvironmentStringsW();
/* for last \0 */
@@ -5062,35 +5062,56 @@ win32_build_env(dict_T *env, garray_T *gap)
*((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
}
- for (hi = env->dv_hashtab.ht_array; todo > 0; ++hi)
+ if (env != NULL)
{
- if (!HASHITEM_EMPTY(hi))
+ for (hi = env->dv_hashtab.ht_array; todo > 0; ++hi)
{
- typval_T *item = &dict_lookup(hi)->di_tv;
- WCHAR *wkey = enc_to_utf16((char_u *)hi->hi_key, NULL);
- WCHAR *wval = enc_to_utf16(get_tv_string(item), NULL);
- --todo;
- if (wkey != NULL && wval != NULL)
+ if (!HASHITEM_EMPTY(hi))
{
- size_t n;
- size_t lkey = wcslen(wkey);
- size_t lval = wcslen(wval);
-
- if (ga_grow(gap, (int)(lkey + lval + 2)) != OK)
- continue;
- for (n = 0; n < lkey; n++)
- *((WCHAR*)gap->ga_data + gap->ga_len++) = wkey[n];
- *((WCHAR*)gap->ga_data + gap->ga_len++) = L'=';
- for (n = 0; n < lval; n++)
- *((WCHAR*)gap->ga_data + gap->ga_len++) = wval[n];
- *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+ typval_T *item = &dict_lookup(hi)->di_tv;
+ WCHAR *wkey = enc_to_utf16((char_u *)hi->hi_key, NULL);
+ WCHAR *wval = enc_to_utf16(get_tv_string(item), NULL);
+ --todo;
+ if (wkey != NULL && wval != NULL)
+ {
+ size_t n;
+ size_t lkey = wcslen(wkey);
+ size_t lval = wcslen(wval);
+
+ if (ga_grow(gap, (int)(lkey + lval + 2)) != OK)
+ continue;
+ for (n = 0; n < lkey; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = wkey[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'=';
+ for (n = 0; n < lval; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = wval[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+ }
+ if (wkey != NULL) vim_free(wkey);
+ if (wval != NULL) vim_free(wval);
}
- if (wkey != NULL) vim_free(wkey);
- if (wval != NULL) vim_free(wval);
}
}
- *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+# ifdef FEAT_CLIENTSERVER
+ if (is_terminal)
+ {
+ char_u *servername = get_vim_var_str(VV_SEND_SERVER);
+ size_t lval = STRLEN(servername);
+ size_t n;
+
+ if (ga_grow(gap, (int)(14 + lval + 2)) == OK)
+ {
+ for (n = 0; n < 15; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)"VIM_SERVERNAME="[n];
+ for (n = 0; n < lval; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)servername[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+ }
+ }
+# endif
}
void
@@ -5133,7 +5154,7 @@ mch_job_start(char *cmd, job_T *job, jobopt_T *options)
}
if (options->jo_env != NULL)
- win32_build_env(options->jo_env, &ga);
+ win32_build_env(options->jo_env, &ga, FALSE);
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro
index 188a45be0..a87d8b767 100644
--- a/src/proto/os_win32.pro
+++ b/src/proto/os_win32.pro
@@ -67,5 +67,5 @@ void used_file_arg(char *name, int literal, int full_path, int diff_mode);
void set_alist_count(void);
void fix_arg_enc(void);
int mch_setenv(char *var, char *value, int x);
-void win32_build_env(dict_T *l, garray_T *gap);
+void win32_build_env(dict_T *l, garray_T *gap, int is_terminal);
/* vim: set ft=c : */
diff --git a/src/terminal.c b/src/terminal.c
index 2e6b39918..716d0b53b 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -3424,12 +3424,10 @@ term_and_job_init(
return FAIL;
if (opt->jo_cwd != NULL)
cwd_wchar = enc_to_utf16(opt->jo_cwd, NULL);
- if (opt->jo_env != NULL)
- {
- ga_init2(&ga_env, (int)sizeof(char*), 20);
- win32_build_env(opt->jo_env, &ga_env);
- env_wchar = ga_env.ga_data;
- }
+
+ ga_init2(&ga_env, (int)sizeof(char*), 20);
+ win32_build_env(opt->jo_env, &ga_env, TRUE);
+ env_wchar = ga_env.ga_data;
job = job_alloc();
if (job == NULL)
@@ -3531,8 +3529,7 @@ term_and_job_init(
failed:
if (argvar->v_type == VAR_LIST)
vim_free(ga_cmd.ga_data);
- if (opt->jo_env != NULL)
- vim_free(ga_env.ga_data);
+ vim_free(ga_env.ga_data);
vim_free(cmd_wchar);
vim_free(cwd_wchar);
if (spawn_config != NULL)
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 295ccf1c9..cdff5c3d4 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -434,6 +434,27 @@ func Test_terminal_cwd()
call delete('Xdir', 'rf')
endfunc
+func Test_terminal_servername()
+ if !has('clientserver')
+ return
+ endif
+ let g:buf = Run_shell_in_terminal({})
+ " Wait for the shell to display a prompt
+ call WaitFor('term_getline(g:buf, 1) != ""')
+ if has('win32')
+ call term_sendkeys(g:buf, "echo %VIM_SERVERNAME%\r")
+ else
+ call term_sendkeys(g:buf, "echo $VIM_SERVERNAME\r")
+ endif
+ call term_wait(g:buf)
+ call Stop_shell_in_terminal(g:buf)
+ call WaitFor('getline(2) == v:servername')
+ call assert_equal(v:servername, getline(2))
+
+ exe g:buf . 'bwipe'
+ unlet g:buf
+endfunc
+
func Test_terminal_env()
let g:buf = Run_shell_in_terminal({'env': {'TESTENV': 'correct'}})
" Wait for the shell to display a prompt
diff --git a/src/version.c b/src/version.c
index 93fb5cbfc..ebc57ed36 100644
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1330,
+/**/
1329,
/**/
1328,