0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

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)
This commit is contained in:
Bram Moolenaar
2017-11-21 18:11:27 +01:00
parent 5505860152
commit 52dbb5ea7f
6 changed files with 82 additions and 34 deletions

View File

@@ -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);
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 (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));