# HG changeset patch # User Christian Brabandt # Date 1511284506 -3600 # Node ID 32531a3eab1f15dc472e068a5606e49a97e1bf1c # Parent c63e99d14a0fecca707c0299a76703c4fdc3a702 patch 8.0.1330: MS-Windows: job in terminal can't get back to Vim commit https://github.com/vim/vim/commit/52dbb5ea7fde4a77178bc59e2383ca40df503812 Author: Bram Moolenaar Date: Tue Nov 21 18:11:27 2017 +0100 patch 8.0.1330: MS-Windows: job in terminal can't get back to Vim Problem: MS-Windows: job in terminal can't get back to Vim. Solution: set VIM_SERVERNAME in the environment. (Yasuhiro Matsumoto, closes #2360) diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt --- 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 trigger 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. 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 --- 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 *g *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0'; } - for (hi = env->dv_hashtab.ht_array; todo > 0; ++hi) - { - if (!HASHITEM_EMPTY(hi)) + if (env != NULL) + { + 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, job } 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 --- a/src/proto/os_win32.pro +++ b/src/proto/os_win32.pro @@ -67,5 +67,5 @@ void used_file_arg(char *name, int liter 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 --- 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 --- 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 --- 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,