Mercurial > vim
diff src/os_win32.c @ 12907:32531a3eab1f v8.0.1330
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 <Bram@vim.org>
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 21 Nov 2017 18:15:06 +0100 |
parents | 1a450ce6980c |
children | 653ae4253f1d |
line wrap: on
line diff
--- 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));