0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

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)
This commit is contained in:
Bram Moolenaar
2017-10-30 21:56:23 +01:00
parent 48570488f1
commit ba6febd380
5 changed files with 40 additions and 14 deletions

View File

@@ -5033,8 +5033,8 @@ job_io_file_open(
* Turn the dictionary "env" into a NUL separated list that can be used as the * Turn the dictionary "env" into a NUL separated list that can be used as the
* environment argument of vim_create_process(). * environment argument of vim_create_process().
*/ */
static void void
make_job_env(garray_T *gap, dict_T *env) win32_build_env(dict_T *env, garray_T *gap)
{ {
hashitem_T *hi; hashitem_T *hi;
int todo = (int)env->dv_hashtab.ht_used; int todo = (int)env->dv_hashtab.ht_used;
@@ -5133,7 +5133,7 @@ mch_job_start(char *cmd, job_T *job, jobopt_T *options)
} }
if (options->jo_env != NULL) if (options->jo_env != NULL)
make_job_env(&ga, options->jo_env); win32_build_env(options->jo_env, &ga);
ZeroMemory(&pi, sizeof(pi)); ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si)); ZeroMemory(&si, sizeof(si));

View File

@@ -67,4 +67,5 @@ void used_file_arg(char *name, int literal, int full_path, int diff_mode);
void set_alist_count(void); void set_alist_count(void);
void fix_arg_enc(void); void fix_arg_enc(void);
int mch_setenv(char *var, char *value, int x); int mch_setenv(char *var, char *value, int x);
void win32_build_env(dict_T *l, garray_T *gap);
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@@ -46,9 +46,18 @@
* - Redirecting output does not work on MS-Windows, Test_terminal_redir_file() * - Redirecting output does not work on MS-Windows, Test_terminal_redir_file()
* is disabled. * is disabled.
* - cursor blinks in terminal on widows with a timer. (xtal8, #2142) * - 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() * - 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: WinBar has tearoff item
* - MS-Windows GUI: still need to type a key after shell exits? #1924 * - 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. * - add test for giving error for invalid 'termsize' value.
* - support minimal size when 'termsize' is "rows*cols". * - support minimal size when 'termsize' is "rows*cols".
* - support minimal size when 'termsize' is empty? * - support minimal size when 'termsize' is empty?
@@ -3390,6 +3399,7 @@ term_and_job_init(
{ {
WCHAR *cmd_wchar = NULL; WCHAR *cmd_wchar = NULL;
WCHAR *cwd_wchar = NULL; WCHAR *cwd_wchar = NULL;
WCHAR *env_wchar = NULL;
channel_T *channel = NULL; channel_T *channel = NULL;
job_T *job = NULL; job_T *job = NULL;
DWORD error; DWORD error;
@@ -3398,7 +3408,7 @@ term_and_job_init(
HANDLE child_thread_handle; HANDLE child_thread_handle;
void *winpty_err; void *winpty_err;
void *spawn_config = NULL; void *spawn_config = NULL;
garray_T ga; garray_T ga_cmd, ga_env;
char_u *cmd; char_u *cmd;
if (dyn_winpty_init(TRUE) == FAIL) if (dyn_winpty_init(TRUE) == FAIL)
@@ -3408,10 +3418,10 @@ term_and_job_init(
cmd = argvar->vval.v_string; cmd = argvar->vval.v_string;
else else
{ {
ga_init2(&ga, (int)sizeof(char*), 20); ga_init2(&ga_cmd, (int)sizeof(char*), 20);
if (win32_build_cmd(argvar->vval.v_list, &ga) == FAIL) if (win32_build_cmd(argvar->vval.v_list, &ga_cmd) == FAIL)
goto failed; goto failed;
cmd = ga.ga_data; cmd = ga_cmd.ga_data;
} }
cmd_wchar = enc_to_utf16(cmd, NULL); cmd_wchar = enc_to_utf16(cmd, NULL);
@@ -3419,6 +3429,12 @@ term_and_job_init(
return FAIL; return FAIL;
if (opt->jo_cwd != NULL) if (opt->jo_cwd != NULL)
cwd_wchar = enc_to_utf16(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(); job = job_alloc();
if (job == NULL) if (job == NULL)
@@ -3446,7 +3462,7 @@ term_and_job_init(
NULL, NULL,
cmd_wchar, cmd_wchar,
cwd_wchar, cwd_wchar,
NULL, env_wchar,
&winpty_err); &winpty_err);
if (spawn_config == NULL) if (spawn_config == NULL)
goto failed; goto failed;
@@ -3519,7 +3535,9 @@ term_and_job_init(
failed: failed:
if (argvar->v_type == VAR_LIST) 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(cmd_wchar);
vim_free(cwd_wchar); vim_free(cwd_wchar);
if (spawn_config != NULL) if (spawn_config != NULL)

View File

@@ -11,7 +11,11 @@ let s:python = PythonProg()
" Open a terminal with a shell, assign the job to g:job and return the buffer " Open a terminal with a shell, assign the job to g:job and return the buffer
" number. " number.
func Run_shell_in_terminal(options) func Run_shell_in_terminal(options)
if has('win32')
let buf = term_start([&shell,'/k'], a:options)
else
let buf = term_start(&shell, a:options) let buf = term_start(&shell, a:options)
endif
let termlist = term_list() let termlist = term_list()
call assert_equal(1, len(termlist)) call assert_equal(1, len(termlist))
@@ -430,13 +434,14 @@ func Test_terminal_cwd()
endfunc endfunc
func Test_terminal_env() func Test_terminal_env()
if !has('unix')
return
endif
let g:buf = Run_shell_in_terminal({'env': {'TESTENV': 'correct'}}) let g:buf = Run_shell_in_terminal({'env': {'TESTENV': 'correct'}})
" Wait for the shell to display a prompt " Wait for the shell to display a prompt
call WaitFor('term_getline(g:buf, 1) != ""') call WaitFor('term_getline(g:buf, 1) != ""')
if has('win32')
call term_sendkeys(g:buf, "echo %TESTENV%\r")
else
call term_sendkeys(g:buf, "echo $TESTENV\r") call term_sendkeys(g:buf, "echo $TESTENV\r")
endif
call term_wait(g:buf) call term_wait(g:buf)
call Stop_shell_in_terminal(g:buf) call Stop_shell_in_terminal(g:buf)
call WaitFor('getline(2) == "correct"') call WaitFor('getline(2) == "correct"')

View File

@@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1240,
/**/ /**/
1239, 1239,
/**/ /**/