summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-01-30 22:31:19 +0100
committerBram Moolenaar <Bram@vim.org>2018-01-30 22:31:19 +0100
commitb50773c6df0bc2c9c2ab1afecc78083abc606de0 (patch)
tree47fb6c76f41240c28e739ae11fd1459ad35d7e5a
parent1274d33493efb6250470a37b9f4432bb31e87d64 (diff)
downloadvim-b50773c6df0bc2c9c2ab1afecc78083abc606de0.zip
patch 8.0.1440: terminal window: some vterm responses are delayed
Problem: Terminal window: some vterm responses are delayed. Solution: After writing input. check if there is output to read. (Ozaki Kiichi, closes #2594)
-rw-r--r--src/terminal.c58
-rw-r--r--src/testdir/test_search.vim2
-rw-r--r--src/testdir/test_terminal.vim23
-rw-r--r--src/version.c2
4 files changed, 62 insertions, 23 deletions
diff --git a/src/terminal.c b/src/terminal.c
index 0d6a9571b..4c0c3de88 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -650,15 +650,50 @@ free_terminal(buf_T *buf)
}
/*
+ * 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,29 +1274,6 @@ term_vgetc()
}
/*
- * 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.
diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim
index 9b96b49fd..130562fc5 100644
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -619,6 +619,8 @@ func Test_search_cmdline_incsearch_highlight_attr()
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>")
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 3116b803f..853c69c30 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -806,3 +806,26 @@ func Test_terminal_term_start_empty_command()
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
diff --git a/src/version.c b/src/version.c
index 09fb30056..282f662a9 100644
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1440,
+/**/
1439,
/**/
1438,