diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-09-02 16:28:36 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-09-02 16:28:36 +0200 |
commit | ef68e4fa528165f8dd63156feeffc1af629b8d8a (patch) | |
tree | 14d8384050c19d4279c316b3fcd43e82ba942734 /src | |
parent | 3346cc4ffb459ecddb97a8c19bcc5834afa4dead (diff) |
patch 8.0.1035: sending buffer lines to terminal doesn't work on MS-Windowsv8.0.1035
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/channel.c | 13 | ||||
-rw-r--r-- | src/structs.h | 1 | ||||
-rw-r--r-- | src/terminal.c | 34 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 42 insertions, 8 deletions
diff --git a/src/channel.c b/src/channel.c index 94a762c610..5a7e2a7301 100644 --- a/src/channel.c +++ b/src/channel.c @@ -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); diff --git a/src/structs.h b/src/structs.h index 20b7ef8057..6cfb5f2f1e 100644 --- a/src/structs.h +++ b/src/structs.h @@ -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 */ diff --git a/src/terminal.c b/src/terminal.c index 0a3e1b71f0..55575d14fe 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -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 diff --git a/src/version.c b/src/version.c index b76c2a9d43..520d46bef5 100644 --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1035, +/**/ 1034, /**/ 1033, |