]> granicus.if.org Git - vim/commitdiff
patch 8.0.1035: sending buffer lines to terminal doesn't work on MS-Windows v8.0.1035
authorBram Moolenaar <Bram@vim.org>
Sat, 2 Sep 2017 14:28:36 +0000 (16:28 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 2 Sep 2017 14:28:36 +0000 (16:28 +0200)
Problem:    Sending buffer lines to terminal doesn't work on MS-Windows.
Solution:   Use CR instead of NL after every line.  Make the EOF text work
            properly.  Add the ++eof argument to :terminal.

runtime/doc/eval.txt
runtime/doc/terminal.txt
src/channel.c
src/structs.h
src/terminal.c
src/version.c

index b9f3c09b1676dc0073ad581ff7c97492bd0e3fea..e8bf16e4e546145a1a31af9b657d5739b55d9390 100644 (file)
@@ -8141,6 +8141,12 @@ term_start({cmd}, {options})                             *term_start()*
                                     have "%d" where the buffer number goes,
                                     e.g. "10split|buffer %d"; when not
                                     specified "botright sbuf %d" is used
+                  "eof_chars"       Text to send after all buffer lines were
+                                    written to the terminal.  When not set
+                                    CTRL-D is used. For Python use CTRL-Z or
+                                    "exit()". For a shell use "exit".  A CR
+                                    is always added.
+                                    {only on MS-Windows}
 
                {only available when compiled with the |+terminal| feature}
 
index 9e903d26a4feaaedea815824f45d5fd453f0e435..7be6927a0bcd6839020891ef4193340548e1a691 100644 (file)
@@ -133,6 +133,14 @@ Syntax ~
                                        height.
                        ++cols={width}  Use {width} for the terminal window
                                        width.
+                       ++eof={text}    when using [range], text to send after
+                                       the last line was written. The default
+                                       is to send CTRL-D.  A CR is appended.
+                                       E.g. for a shell use "++eof=exit" and
+                                       for Python "++eof=exit()".  Special
+                                       codes can be used like with `:map`,
+                                       e.g. "<C-Z>" for CTRL-Z.
+                                       {only on MS-Windows}
 
                        If you want to use more options use the |term_start()|
                        function.
@@ -141,11 +149,13 @@ When the buffer associated with the terminal is unloaded or wiped out the job
 is killed, similar to calling `job_stop(job, "kill")`
 
 So long as the job is running the window behaves like it contains a modified
-buffer.  Trying to close the window with `CTRL-W :close` or `CTRL-W :hide`
-fails, unless "!" is added, in which case the job is ended.  The text in the
-window is lost.  The buffer still exists, but getting it in a window with
-`:buffer` will show an
-empty buffer.
+buffer.  Trying to close the window with `CTRL-W :quit` fails.  When using
+`CTRL-W :quit!` the job is ended.  The text in the window is lost.  The buffer
+still exists, but getting it in a window with `:buffer` will show an empty
+buffer.
+
+Trying to close the window with `CTRL-W :close` also fails.   Using
+`CTRL-W :close!` will close the window and make the buffer hidden.
 
 You can use `CTRL-W :hide` to close the terminal window and make the buffer
 hidden, the job keeps running.  The `:buffer` command can be used to turn the
index 94a762c6106d03a23e5de86a9937397b20e0effa..5a7e2a730138dad01e0ef812f17da267d3619bba 100644 (file)
@@ -1300,11 +1300,16 @@ write_buf_line(buf_T *buf, linenr_T lnum, channel_T *channel)
        return;
     memcpy((char *)p, (char *)line, len);
 
-    for (i = 0; i < len; ++i)
-       if (p[i] == NL)
-           p[i] = NUL;
+    if (channel->ch_write_text_mode)
+       p[len] = CAR;
+    else
+    {
+       for (i = 0; i < len; ++i)
+           if (p[i] == NL)
+               p[i] = NUL;
 
-    p[len] = NL;
+       p[len] = NL;
+    }
     p[len + 1] = NUL;
     channel_send(channel, PART_IN, p, len + 1, "write_buf_line");
     vim_free(p);
index 20b7ef80570d4b8c8adc01e576c5e966570be1e4..6cfb5f2f1ea9924cd99a5366bd00273041e1e915 100644 (file)
@@ -1632,6 +1632,7 @@ struct channel_S {
     int                ch_last_msg_id; /* ID of the last message */
 
     chanpart_T ch_part[PART_COUNT]; /* info for socket, out, err and in */
+    int                ch_write_text_mode; /* write buffer lines with CR, not NL */
 
     char       *ch_hostname;   /* only for socket, allocated */
     int                ch_port;        /* only for socket */
index 0a3e1b71f0ac23dc4b02119c7901237f17577753..55575d14feb4cf52d09afdc52a8dc565ca0ce60b 100644 (file)
@@ -496,6 +496,24 @@ ex_terminal(exarg_T *eap)
            opt.jo_term_cols = atoi((char *)ep + 1);
            p = skiptowhite(cmd);
        }
+       else if ((int)(p - cmd) == 3 && STRNICMP(cmd, "eof", 3) == 0
+                                                                && ep != NULL)
+       {
+# ifdef WIN3264
+           char_u *buf = NULL;
+           char_u *keys;
+
+           p = skiptowhite(cmd);
+           *p = NUL;
+           keys = replace_termcodes(ep + 1, &buf, TRUE, TRUE, TRUE);
+           opt.jo_set2 |= JO2_EOF_CHARS;
+           opt.jo_eof_chars = vim_strsave(keys);
+           vim_free(buf);
+           *p = ' ';
+# else
+           p = skiptowhite(cmd);
+# endif
+       }
        else
        {
            if (*p)
@@ -3069,8 +3087,6 @@ term_and_job_init(
     if (job == NULL)
        goto failed;
 
-    /* TODO: when all lines are written and the fd is closed, the command
-     * doesn't get EOF and hangs. */
     if (opt->jo_set & JO_IN_BUF)
        job->jv_in_buf = buflist_findnr(opt->jo_io_buf[PART_IN]);
 
@@ -3092,6 +3108,9 @@ term_and_job_init(
            GENERIC_READ, 0, NULL,
            OPEN_EXISTING, 0, NULL));
 
+    /* Write lines with CR instead of NL. */
+    channel->ch_write_text_mode = TRUE;
+
     jo = CreateJobObject(NULL, NULL);
     if (jo == NULL)
        goto failed;
@@ -3208,8 +3227,15 @@ term_send_eof(channel_T *ch)
 
     for (term = first_term; term != NULL; term = term->tl_next)
        if (term->tl_job == ch->ch_job)
-           channel_send(ch, PART_IN, term->tl_eof_chars != NULL
-                        ? term->tl_eof_chars : (char_u *)"\004\r\n", 3, NULL);
+       {
+           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 b76c2a9d43c29d90ba8d3a1ac1258266b48f6d5c..520d46bef5b36a7aa279b0f17bcff32b5d093979 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1035,
 /**/
     1034,
 /**/