# HG changeset patch # User Christian Brabandt # Date 1509397206 -3600 # Node ID 17c257dd2438b9f80a871ccccbe18fe766821323 # Parent 08ef53ed022c09aee56146c8fdc51163d8c229b2 patch 8.0.1240: MS-Windows: term_start() does not support environment commit https://github.com/vim/vim/commit/ba6febd380c931b92361a189e85b19ed467c9c64 Author: Bram Moolenaar Date: Mon Oct 30 21:56:23 2017 +0100 patch 8.0.1240: MS-Windows: term_start() does not support environment Problem: MS-Windows: term_start() does not support environment. Solution: Implement the environment argument. (Yasuhiro Matsumoto, closes #2264) diff --git a/src/os_win32.c b/src/os_win32.c --- a/src/os_win32.c +++ b/src/os_win32.c @@ -5033,8 +5033,8 @@ job_io_file_open( * Turn the dictionary "env" into a NUL separated list that can be used as the * environment argument of vim_create_process(). */ - static void -make_job_env(garray_T *gap, dict_T *env) + void +win32_build_env(dict_T *env, garray_T *gap) { hashitem_T *hi; int todo = (int)env->dv_hashtab.ht_used; @@ -5133,7 +5133,7 @@ mch_job_start(char *cmd, job_T *job, job } if (options->jo_env != NULL) - make_job_env(&ga, options->jo_env); + win32_build_env(options->jo_env, &ga); 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,4 +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); /* vim: set ft=c : */ diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -46,9 +46,18 @@ * - Redirecting output does not work on MS-Windows, Test_terminal_redir_file() * is disabled. * - cursor blinks in terminal on widows with a timer. (xtal8, #2142) + * - When closing gvim with an active terminal buffer, the dialog suggests + * saving the buffer. Should say something else. (Manas Thakur, #2215) + * Also: #2223 * - implement term_setsize() + * - Termdebug does not work when Vim build with mzscheme. gdb hangs. + * - Termdebug: issue #2154 might be avoided by adding -quiet to gdb? + * patch by Christian, 2017 Oct 23. * - MS-Windows GUI: WinBar has tearoff item * - MS-Windows GUI: still need to type a key after shell exits? #1924 + * - What to store in a session file? Shell at the prompt would be OK to + * restore, but others may not. Open the window and let the user start the + * command? * - add test for giving error for invalid 'termsize' value. * - support minimal size when 'termsize' is "rows*cols". * - support minimal size when 'termsize' is empty? @@ -3390,6 +3399,7 @@ term_and_job_init( { WCHAR *cmd_wchar = NULL; WCHAR *cwd_wchar = NULL; + WCHAR *env_wchar = NULL; channel_T *channel = NULL; job_T *job = NULL; DWORD error; @@ -3398,7 +3408,7 @@ term_and_job_init( HANDLE child_thread_handle; void *winpty_err; void *spawn_config = NULL; - garray_T ga; + garray_T ga_cmd, ga_env; char_u *cmd; if (dyn_winpty_init(TRUE) == FAIL) @@ -3408,10 +3418,10 @@ term_and_job_init( cmd = argvar->vval.v_string; else { - ga_init2(&ga, (int)sizeof(char*), 20); - if (win32_build_cmd(argvar->vval.v_list, &ga) == FAIL) + ga_init2(&ga_cmd, (int)sizeof(char*), 20); + if (win32_build_cmd(argvar->vval.v_list, &ga_cmd) == FAIL) goto failed; - cmd = ga.ga_data; + cmd = ga_cmd.ga_data; } cmd_wchar = enc_to_utf16(cmd, NULL); @@ -3419,6 +3429,12 @@ 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; + } job = job_alloc(); if (job == NULL) @@ -3446,7 +3462,7 @@ term_and_job_init( NULL, cmd_wchar, cwd_wchar, - NULL, + env_wchar, &winpty_err); if (spawn_config == NULL) goto failed; @@ -3519,7 +3535,9 @@ term_and_job_init( failed: if (argvar->v_type == VAR_LIST) - vim_free(ga.ga_data); + vim_free(ga_cmd.ga_data); + if (opt->jo_env != NULL) + 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 @@ -11,7 +11,11 @@ let s:python = PythonProg() " Open a terminal with a shell, assign the job to g:job and return the buffer " number. func Run_shell_in_terminal(options) - let buf = term_start(&shell, a:options) + if has('win32') + let buf = term_start([&shell,'/k'], a:options) + else + let buf = term_start(&shell, a:options) + endif let termlist = term_list() call assert_equal(1, len(termlist)) @@ -430,13 +434,14 @@ func Test_terminal_cwd() endfunc func Test_terminal_env() - if !has('unix') - return - endif let g:buf = Run_shell_in_terminal({'env': {'TESTENV': 'correct'}}) " Wait for the shell to display a prompt call WaitFor('term_getline(g:buf, 1) != ""') - call term_sendkeys(g:buf, "echo $TESTENV\r") + if has('win32') + call term_sendkeys(g:buf, "echo %TESTENV%\r") + else + call term_sendkeys(g:buf, "echo $TESTENV\r") + endif call term_wait(g:buf) call Stop_shell_in_terminal(g:buf) call WaitFor('getline(2) == "correct"') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1240, +/**/ 1239, /**/ 1238,