From d7a137fb0d980545dd567bee9c24cf7b9c3a2eae Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 12 Jun 2018 18:05:24 +0200 Subject: [PATCH] patch 8.1.0049: shell cannot tell running in a terminal window Problem: Shell cannot tell running in a terminal window. Solution: Add the VIM_TERMINAL environment variable. (Christian Brabandt) --- runtime/doc/terminal.txt | 1 + src/os_unix.c | 6 ++++++ src/os_win32.c | 30 ++++++++++++++++++++++++------ src/testdir/test_terminal.vim | 15 +++++++++++---- src/version.c | 2 ++ 5 files changed, 44 insertions(+), 10 deletions(-) diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt index b3fe52286..e4cca3443 100644 --- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -376,6 +376,7 @@ Environment variables are used to pass information to the running job: COLUMNS number of columns in the terminal initially COLORS number of colors, 't_Co' (256*256*256 in the GUI) VIM_SERVERNAME v:servername + VIM_TERMINAL v:version MS-Windows ~ diff --git a/src/os_unix.c b/src/os_unix.c index 1609bb8e2..a9fb3b51c 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4169,6 +4169,7 @@ set_child_environment(long rows, long columns, char *term) static char envbuf_Lines[20]; static char envbuf_Columns[20]; static char envbuf_Colors[20]; + static char envbuf_Version[20]; # ifdef FEAT_CLIENTSERVER static char envbuf_Servername[60]; # endif @@ -4189,6 +4190,8 @@ set_child_environment(long rows, long columns, char *term) setenv("COLUMNS", (char *)envbuf, 1); sprintf((char *)envbuf, "%ld", colors); setenv("COLORS", (char *)envbuf, 1); + sprintf((char *)envbuf, "%ld", get_vim_var_nr(VV_VERSION)); + setenv("VIM_TERMINAL", (char *)envbuf, 1); # ifdef FEAT_CLIENTSERVER setenv("VIM_SERVERNAME", serverName == NULL ? "" : (char *)serverName, 1); # endif @@ -4209,6 +4212,9 @@ set_child_environment(long rows, long columns, char *term) putenv(envbuf_Columns); vim_snprintf(envbuf_Colors, sizeof(envbuf_Colors), "COLORS=%ld", colors); putenv(envbuf_Colors); + vim_snprintf(envbuf_Version, sizeof(envbuf_Version), "VIM_TERMINAL=%ld", + get_vim_var_nr(VV_VERSION)); + putenv(envbuf_Version); # ifdef FEAT_CLIENTSERVER vim_snprintf(envbuf_Servername, sizeof(envbuf_Servername), "VIM_SERVERNAME=%s", serverName == NULL ? "" : (char *)serverName); diff --git a/src/os_win32.c b/src/os_win32.c index 602ef8aa2..3b0291e9b 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -5275,25 +5275,43 @@ win32_build_env(dict_T *env, garray_T *gap, int is_terminal) } } -# ifdef FEAT_CLIENTSERVER if (is_terminal) { +# ifdef FEAT_CLIENTSERVER char_u *servername = get_vim_var_str(VV_SEND_SERVER); - size_t lval = STRLEN(servername); - size_t n; + size_t servername_len = STRLEN(servername); +# endif + char_u *version = get_vim_var_str(VV_VERSION); + size_t version_len = STRLEN(version); + // size of "VIM_SERVERNAME=" and value, + // plus "VIM_TERMINAL=" and value, + // plus two terminating NULs + size_t n = 0 +# ifdef FEAT_CLIENTSERVER + + 15 + servername_len +# endif + + 13 + version_len + 2; - if (ga_grow(gap, (int)(14 + lval + 2)) == OK) + if (ga_grow(gap, (int)n) == OK) { +# ifdef FEAT_CLIENTSERVER for (n = 0; n < 15; n++) *((WCHAR*)gap->ga_data + gap->ga_len++) = (WCHAR)"VIM_SERVERNAME="[n]; - for (n = 0; n < lval; n++) + for (n = 0; n < servername_len; n++) *((WCHAR*)gap->ga_data + gap->ga_len++) = (WCHAR)servername[n]; *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0'; +# endif + for (n = 0; n < 13; n++) + *((WCHAR*)gap->ga_data + gap->ga_len++) = + (WCHAR)"VIM_TERMINAL="[n]; + for (n = 0; n < version_len; n++) + *((WCHAR*)gap->ga_data + gap->ga_len++) = + (WCHAR)version[n]; + *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0'; } } -# endif } void diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim index 3d06eb387..c082b3b73 100644 --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -482,18 +482,25 @@ func Test_terminal_servername() if !has('clientserver') return endif + call s:test_environment("VIM_SERVERNAME", v:servername) +endfunc + +func Test_terminal_version() + call s:test_environment("VIM_TERMINAL", string(v:version)) +endfunc + +func s:test_environment(name, value) let buf = Run_shell_in_terminal({}) " Wait for the shell to display a prompt call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) if has('win32') - call term_sendkeys(buf, "echo %VIM_SERVERNAME%\r") + call term_sendkeys(buf, "echo %" . a:name . "%\r") else - call term_sendkeys(buf, "echo $VIM_SERVERNAME\r") + call term_sendkeys(buf, "echo $" . a:name . "\r") endif call term_wait(buf) call Stop_shell_in_terminal(buf) - call WaitFor('getline(2) == v:servername') - call assert_equal(v:servername, getline(2)) + call WaitForAssert({-> assert_equal(a:value, getline(2))}) exe buf . 'bwipe' unlet buf diff --git a/src/version.c b/src/version.c index fc68f8ef2..770eea8f0 100644 --- a/src/version.c +++ b/src/version.c @@ -761,6 +761,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 49, /**/ 48, /**/ -- 2.40.0