To: vim_dev@googlegroups.com Subject: Patch 8.0.1440 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1440 Problem: Terminal window: some vterm responses are delayed. Solution: After writing input. check if there is output to read. (Ozaki Kiichi, closes #2594) Files: src/terminal.c, src/testdir/test_search.vim, src/testdir/test_terminal.vim *** ../vim-8.0.1439/src/terminal.c 2018-01-26 21:10:59.531172083 +0100 --- src/terminal.c 2018-01-30 22:29:26.724773911 +0100 *************** *** 650,664 **** --- 650,699 ---- } /* + * Get the part that is connected to the tty. Normally this is PART_IN, but + * when writing buffer lines to the job it can be another. This makes it + * possible to do "1,5term vim -". + */ + static ch_part_T + get_tty_part(term_T *term) + { + #ifdef UNIX + ch_part_T parts[3] = {PART_IN, PART_OUT, PART_ERR}; + int i; + + for (i = 0; i < 3; ++i) + { + int fd = term->tl_job->jv_channel->ch_part[parts[i]].ch_fd; + + if (isatty(fd)) + return parts[i]; + } + #endif + return PART_IN; + } + + /* * Write job output "msg[len]" to the vterm. */ static void term_write_job_output(term_T *term, char_u *msg, size_t len) { VTerm *vterm = term->tl_vterm; + size_t prevlen = vterm_output_get_buffer_current(vterm); vterm_input_write(vterm, (char *)msg, len); + /* flush vterm buffer when vterm responded to control sequence */ + if (prevlen != vterm_output_get_buffer_current(vterm)) + { + char buf[KEY_BUF_LEN]; + size_t curlen = vterm_output_read(vterm, buf, KEY_BUF_LEN); + + if (curlen > 0) + channel_send(term->tl_job->jv_channel, get_tty_part(term), + (char_u *)buf, (int)curlen, NULL); + } + /* this invokes the damage callbacks */ vterm_screen_flush_damage(vterm_obtain_screen(vterm)); } *************** *** 1239,1267 **** } /* - * Get the part that is connected to the tty. Normally this is PART_IN, but - * when writing buffer lines to the job it can be another. This makes it - * possible to do "1,5term vim -". - */ - static ch_part_T - get_tty_part(term_T *term) - { - #ifdef UNIX - ch_part_T parts[3] = {PART_IN, PART_OUT, PART_ERR}; - int i; - - for (i = 0; i < 3; ++i) - { - int fd = term->tl_job->jv_channel->ch_part[parts[i]].ch_fd; - - if (isatty(fd)) - return parts[i]; - } - #endif - return PART_IN; - } - - /* * Send keys to terminal. * Return FAIL when the key needs to be handled in Normal mode. * Return OK when the key was dropped or sent to the terminal. --- 1274,1279 ---- *** ../vim-8.0.1439/src/testdir/test_search.vim 2017-12-19 22:25:35.267003085 +0100 --- src/testdir/test_search.vim 2018-01-30 22:26:30.750182498 +0100 *************** *** 619,624 **** --- 619,626 ---- let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3}) call WaitFor({-> lines == [term_getline(buf, 1), term_getline(buf, 2)] }) + " wait for vim to complete initialization + call term_wait(buf) " Get attr of normal(a0), incsearch(a1), hlsearch(a2) highlight call term_sendkeys(buf, ":set incsearch hlsearch\") *** ../vim-8.0.1439/src/testdir/test_terminal.vim 2018-01-26 20:05:04.149790948 +0100 --- src/testdir/test_terminal.vim 2018-01-30 22:26:30.750182498 +0100 *************** *** 806,808 **** --- 806,831 ---- let cmd = "call term_start(0, {'curwin' : 1, 'term_finish' : 'close'})" call assert_fails(cmd, 'E474') endfunc + + func Test_terminal_response_to_control_sequence() + if !has('unix') + return + endif + + let buf = Run_shell_in_terminal({}) + call term_wait(buf) + + call term_sendkeys(buf, s:python . " -c 'import sys;sys.stdout.write(\"\\x1b[6n\")'\") + " wait for the response of control sequence from libvterm (and send it to tty) + call term_wait(buf, 100) + " wait for output from tty to display + call term_wait(buf) + call assert_match(';\d\+R', term_getline(buf, 2)) + + call term_sendkeys(buf, "\") + call term_wait(buf) + call Stop_shell_in_terminal(buf) + + exe buf . 'bwipe' + unlet g:job + endfunc *** ../vim-8.0.1439/src/version.c 2018-01-30 21:47:48.025251378 +0100 --- src/version.c 2018-01-30 22:28:05.673422487 +0100 *************** *** 773,774 **** --- 773,776 ---- { /* Add new patch number below this line */ + /**/ + 1440, /**/ -- Ten bugs in the hand is better than one as yet undetected. /// 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 ///