To: vim_dev@googlegroups.com Subject: Patch 8.0.1036 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1036 Problem: ++eof argument for terminal only available on MS-Windows. Solution: Also support ++eof on Unix. Add a test. Files: src/channel.c, src/terminal.c, src/structs.h, src/testdir/test_terminal.vim *** ../vim-8.0.1035/src/channel.c 2017-09-02 16:28:32.994776598 +0200 --- src/channel.c 2017-09-02 17:04:03.724664080 +0200 *************** *** 1422,1430 **** 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 (channel->ch_job != NULL) term_send_eof(channel); #endif --- 1422,1429 ---- in_part->ch_buf_top = lnum; if (lnum > buf->b_ml.ml_line_count || lnum > in_part->ch_buf_bot) { ! #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,4646 **** } else if (STRCMP(hi->hi_key, "eof_chars") == 0) { - # ifdef WIN3264 char_u *p; if (!(supported2 & JO2_EOF_CHARS)) --- 4639,4644 ---- *************** *** 4652,4658 **** EMSG2(_(e_invarg2), "term_opencmd"); return FAIL; } - # endif } else if (STRCMP(hi->hi_key, "term_rows") == 0) { --- 4650,4655 ---- *** ../vim-8.0.1035/src/terminal.c 2017-09-02 16:28:32.994776598 +0200 --- src/terminal.c 2017-09-02 17:04:20.384554524 +0200 *************** *** 110,120 **** int tl_channel_closed; int tl_finish; /* 'c' for ++close, 'o' for ++open */ char_u *tl_opencmd; #ifdef WIN3264 void *tl_winpty_config; void *tl_winpty; - char_u *tl_eof_chars; #endif /* last known vterm size */ --- 110,120 ---- 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; #endif /* last known vterm size */ *************** *** 390,399 **** 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); --- 390,397 ---- *************** *** 499,505 **** else if ((int)(p - cmd) == 3 && STRNICMP(cmd, "eof", 3) == 0 && ep != NULL) { - # ifdef WIN3264 char_u *buf = NULL; char_u *keys; --- 497,502 ---- *************** *** 510,518 **** opt.jo_eof_chars = vim_strsave(keys); vim_free(buf); *p = ' '; - # else - p = skiptowhite(cmd); - # endif } else { --- 507,512 ---- *************** *** 594,602 **** 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; --- 588,594 ---- *************** *** 2917,2922 **** --- 2909,2940 ---- } } + /* + * 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,3243 **** 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 /************************************** --- 3234,3239 ---- *** ../vim-8.0.1035/src/structs.h 2017-09-02 16:28:32.994776598 +0200 --- src/structs.h 2017-09-02 17:04:28.756499469 +0200 *************** *** 1781,1789 **** 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; --- 1781,1787 ---- *** ../vim-8.0.1035/src/testdir/test_terminal.vim 2017-09-02 14:54:16.384533128 +0200 --- src/testdir/test_terminal.vim 2017-09-02 17:14:17.120621849 +0200 *************** *** 490,513 **** 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 endif new call setline(1, ['one', 'two', 'three']) %term wc ! call WaitFor('getline(1) != ""') let nrs = split(getline('$')) call assert_equal(['3', '3', '14'], nrs) bwipe call setline(1, ['one', 'two', 'three', 'four']) 2,3term wc ! call WaitFor('getline(1) != ""') let nrs = split(getline('$')) call assert_equal(['2', '2', '10'], nrs) bwipe bwipe! endfunc --- 490,536 ---- func Test_terminal_write_stdin() if !executable('wc') ! throw 'skipped: wc command not available' endif new call setline(1, ['one', 'two', 'three']) %term wc ! 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("$") =~ "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= python + call WaitFor('getline("$") =~ "Z"') + call assert_equal('hello', getline(line('$') - 1)) + bwipe + endif + endif + bwipe! endfunc *** ../vim-8.0.1035/src/version.c 2017-09-02 16:28:33.002776544 +0200 --- src/version.c 2017-09-02 16:58:11.478983833 +0200 *************** *** 771,772 **** --- 771,774 ---- { /* Add new patch number below this line */ + /**/ + 1036, /**/ -- hundred-and-one symptoms of being an internet addict: 49. You never have to deal with busy signals when calling your ISP...because you never log off. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///