]> granicus.if.org Git - vim/commitdiff
patch 8.1.0049: shell cannot tell running in a terminal window v8.1.0049
authorBram Moolenaar <Bram@vim.org>
Tue, 12 Jun 2018 16:05:24 +0000 (18:05 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 12 Jun 2018 16:05:24 +0000 (18:05 +0200)
Problem:    Shell cannot tell running in a terminal window.
Solution:   Add the VIM_TERMINAL environment variable. (Christian Brabandt)

runtime/doc/terminal.txt
src/os_unix.c
src/os_win32.c
src/testdir/test_terminal.vim
src/version.c

index b3fe52286438eb1cc88d4d55ed856b6eccc91364..e4cca3443865decbec826fdc3c0af2db977568bc 100644 (file)
@@ -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 ~
index 1609bb8e2d7b58a124ce67b34f5d3d0cbf64908e..a9fb3b51c88b1028abd542d57dc4fcf61c7d8fab 100644 (file)
@@ -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);
index 602ef8aa2181b7690d50113236b8580f8eac523c..3b0291e9b17f21e3fcf95797ed37888c8e279662 100644 (file)
@@ -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
index 3d06eb3876ca128a223e0633353bcb25c839d326..c082b3b73e073a38b359418f3cd034e24e33056e 100644 (file)
@@ -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
index fc68f8ef2eb76d1a81f325e5eafc0ecca519ba4a..770eea8f044bb83246053b1eb86213c9ac6ff6dd 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    49,
 /**/
     48,
 /**/