]> granicus.if.org Git - vim/commitdiff
patch 8.0.1036: ++eof argument for terminal only available on MS-Windows v8.0.1036
authorBram Moolenaar <Bram@vim.org>
Sat, 2 Sep 2017 15:18:35 +0000 (17:18 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 2 Sep 2017 15:18:35 +0000 (17:18 +0200)
Problem:    ++eof argument for terminal only available on MS-Windows.
Solution:   Also support ++eof on Unix.  Add a test.

src/channel.c
src/structs.h
src/terminal.c
src/testdir/test_terminal.vim
src/version.c

index 5a7e2a730138dad01e0ef812f17da267d3619bba..30a4304d8a6ae09762e0f97aad8f22b4551d8099 100644 (file)
@@ -1422,9 +1422,8 @@ channel_write_in(channel_T *channel)
     in_part->ch_buf_top = lnum;
     if (lnum > buf->b_ml.ml_line_count || lnum > in_part->ch_buf_bot)
     {
-#if defined(WIN32) && defined(FEAT_TERMINAL)
-       /* Send CTRL-D or "eof_chars" to close stdin on Windows. A console
-        * application doesn't treat closing stdin like UNIX. */
+#if defined(FEAT_TERMINAL)
+       /* Send CTRL-D or "eof_chars" to close stdin on MS-Windows. */
        if (channel->ch_job != NULL)
            term_send_eof(channel);
 #endif
@@ -4640,7 +4639,6 @@ get_job_options(typval_T *tv, jobopt_T *opt, int supported, int supported2)
            }
            else if (STRCMP(hi->hi_key, "eof_chars") == 0)
            {
-# ifdef WIN3264
                char_u *p;
 
                if (!(supported2 & JO2_EOF_CHARS))
@@ -4652,7 +4650,6 @@ get_job_options(typval_T *tv, jobopt_T *opt, int supported, int supported2)
                    EMSG2(_(e_invarg2), "term_opencmd");
                    return FAIL;
                }
-# endif
            }
            else if (STRCMP(hi->hi_key, "term_rows") == 0)
            {
index 6cfb5f2f1ea9924cd99a5366bd00273041e1e915..f19377e36a93c40c5ab9b992cc4d75d18a48a6b3 100644 (file)
@@ -1781,9 +1781,7 @@ typedef struct
     char_u     *jo_term_name;
     char_u     *jo_term_opencmd;
     int                jo_term_finish;
-# ifdef WIN3264
     char_u     *jo_eof_chars;
-# endif
 #endif
 } jobopt_T;
 
index 55575d14feb4cf52d09afdc52a8dc565ca0ce60b..faa74f7f47ca9f6b95f2226ddda3218f9e23dc4e 100644 (file)
@@ -110,11 +110,11 @@ struct terminal_S {
     int                tl_channel_closed;
     int                tl_finish;      /* 'c' for ++close, 'o' for ++open */
     char_u     *tl_opencmd;
+    char_u     *tl_eof_chars;
 
 #ifdef WIN3264
     void       *tl_winpty_config;
     void       *tl_winpty;
-    char_u     *tl_eof_chars;
 #endif
 
     /* last known vterm size */
@@ -390,10 +390,8 @@ term_start(typval_T *argvar, jobopt_T *opt, int forceit)
     if (opt->jo_term_opencmd != NULL)
        term->tl_opencmd = vim_strsave(opt->jo_term_opencmd);
 
-# ifdef WIN3264
     if (opt->jo_eof_chars != NULL)
        term->tl_eof_chars = vim_strsave(opt->jo_eof_chars);
-# endif
 
     set_string_option_direct((char_u *)"buftype", -1,
                                  (char_u *)"terminal", OPT_FREE|OPT_LOCAL, 0);
@@ -499,7 +497,6 @@ ex_terminal(exarg_T *eap)
        else if ((int)(p - cmd) == 3 && STRNICMP(cmd, "eof", 3) == 0
                                                                 && ep != NULL)
        {
-# ifdef WIN3264
            char_u *buf = NULL;
            char_u *keys;
 
@@ -510,9 +507,6 @@ ex_terminal(exarg_T *eap)
            opt.jo_eof_chars = vim_strsave(keys);
            vim_free(buf);
            *p = ' ';
-# else
-           p = skiptowhite(cmd);
-# endif
        }
        else
        {
@@ -594,9 +588,7 @@ free_terminal(buf_T *buf)
     vim_free(term->tl_title);
     vim_free(term->tl_status_text);
     vim_free(term->tl_opencmd);
-# ifdef WIN3264
     vim_free(term->tl_eof_chars);
-# endif
     vim_free(term->tl_cursor_color);
     vim_free(term);
     buf->b_term = NULL;
@@ -2917,6 +2909,32 @@ f_term_wait(typval_T *argvars, typval_T *rettv UNUSED)
     }
 }
 
+/*
+ * Called when a channel has sent all the lines to a terminal.
+ * Send a CTRL-D to mark the end of the text.
+ */
+    void
+term_send_eof(channel_T *ch)
+{
+    term_T     *term;
+
+    for (term = first_term; term != NULL; term = term->tl_next)
+       if (term->tl_job == ch->ch_job)
+       {
+           if (term->tl_eof_chars != NULL)
+           {
+               channel_send(ch, PART_IN, term->tl_eof_chars,
+                                       (int)STRLEN(term->tl_eof_chars), NULL);
+               channel_send(ch, PART_IN, (char_u *)"\r", 1, NULL);
+           }
+# ifdef WIN3264
+           else
+               /* Default: CTRL-D */
+               channel_send(ch, PART_IN, (char_u *)"\004\r", 2, NULL);
+# endif
+       }
+}
+
 # if defined(WIN3264) || defined(PROTO)
 
 /**************************************
@@ -3216,28 +3234,6 @@ terminal_enabled(void)
     return dyn_winpty_init(FALSE) == OK;
 }
 
-/*
- * Called when a channel has sent all the lines to a terminal.
- * Send a CTRL-D to mark the end of the text.
- */
-    void
-term_send_eof(channel_T *ch)
-{
-    term_T     *term;
-
-    for (term = first_term; term != NULL; term = term->tl_next)
-       if (term->tl_job == ch->ch_job)
-       {
-           if (term->tl_eof_chars != NULL)
-               channel_send(ch, PART_IN, term->tl_eof_chars,
-                                       (int)STRLEN(term->tl_eof_chars), NULL);
-           else
-               /* Default: CTRL-D */
-               channel_send(ch, PART_IN, (char_u *)"\004", 1, NULL);
-           channel_send(ch, PART_IN, (char_u *)"\r", 1, NULL);
-       }
-}
-
 # else
 
 /**************************************
index 573db1e01de083b26e92cd09cc061f6ba33f109c..c70b612953d362f322b8cc0c7534176394b90202 100644 (file)
@@ -490,24 +490,47 @@ endfunc
 
 func Test_terminal_write_stdin()
   if !executable('wc')
-    call ch_log('Test_terminal_write_stdin() is skipped because system doesn''t have wc command')
-    return
+    throw 'skipped: wc command not available'
   endif
   new
   call setline(1, ['one', 'two', 'three'])
   %term wc
-  call WaitFor('getline(1) != ""')
+  call WaitFor('getline("$") =~ "3"')
   let nrs = split(getline('$'))
   call assert_equal(['3', '3', '14'], nrs)
   bwipe
 
+  new
   call setline(1, ['one', 'two', 'three', 'four'])
   2,3term wc
-  call WaitFor('getline(1) != ""')
+  call WaitFor('getline("$") =~ "2"')
   let nrs = split(getline('$'))
   call assert_equal(['2', '2', '10'], nrs)
   bwipe
 
+  if executable('python')
+    new
+    call setline(1, ['print("hello")'])
+    1term ++eof=exit() python
+    " MS-Windows echoes the input, Unix doesn't.
+    call WaitFor('getline("$") =~ "exit" || getline(1) =~ "hello"')
+    if getline(1) =~ 'hello'
+      call assert_equal('hello', getline(1))
+    else
+      call assert_equal('hello', getline(line('$') - 1))
+    endif
+    bwipe
+
+    if has('win32')
+      new
+      call setline(1, ['print("hello")'])
+      1term ++eof=<C-Z> python
+      call WaitFor('getline("$") =~ "Z"')
+      call assert_equal('hello', getline(line('$') - 1))
+      bwipe
+    endif
+  endif
+
   bwipe!
 endfunc
 
index 520d46bef5b36a7aa279b0f17bcff32b5d093979..579f0a2b60009c9051875b893d6d9646ea27179b 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1036,
 /**/
     1035,
 /**/