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\<cr>")
*** ../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\")'\<cr>")
+   " 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, "\<c-c>")
+   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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui