mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
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)
This commit is contained in:
@@ -649,6 +649,29 @@ free_terminal(buf_T *buf)
|
|||||||
in_terminal_loop = NULL;
|
in_terminal_loop = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
* Write job output "msg[len]" to the vterm.
|
||||||
*/
|
*/
|
||||||
@@ -656,9 +679,21 @@ free_terminal(buf_T *buf)
|
|||||||
term_write_job_output(term_T *term, char_u *msg, size_t len)
|
term_write_job_output(term_T *term, char_u *msg, size_t len)
|
||||||
{
|
{
|
||||||
VTerm *vterm = term->tl_vterm;
|
VTerm *vterm = term->tl_vterm;
|
||||||
|
size_t prevlen = vterm_output_get_buffer_current(vterm);
|
||||||
|
|
||||||
vterm_input_write(vterm, (char *)msg, len);
|
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 */
|
/* this invokes the damage callbacks */
|
||||||
vterm_screen_flush_damage(vterm_obtain_screen(vterm));
|
vterm_screen_flush_damage(vterm_obtain_screen(vterm));
|
||||||
}
|
}
|
||||||
@@ -1238,29 +1273,6 @@ term_vgetc()
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
* Send keys to terminal.
|
||||||
* Return FAIL when the key needs to be handled in Normal mode.
|
* Return FAIL when the key needs to be handled in Normal mode.
|
||||||
|
@@ -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})
|
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)] })
|
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
|
" Get attr of normal(a0), incsearch(a1), hlsearch(a2) highlight
|
||||||
call term_sendkeys(buf, ":set incsearch hlsearch\<cr>")
|
call term_sendkeys(buf, ":set incsearch hlsearch\<cr>")
|
||||||
|
@@ -806,3 +806,26 @@ func Test_terminal_term_start_empty_command()
|
|||||||
let cmd = "call term_start(0, {'curwin' : 1, 'term_finish' : 'close'})"
|
let cmd = "call term_start(0, {'curwin' : 1, 'term_finish' : 'close'})"
|
||||||
call assert_fails(cmd, 'E474')
|
call assert_fails(cmd, 'E474')
|
||||||
endfunc
|
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
|
||||||
|
@@ -771,6 +771,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1440,
|
||||||
/**/
|
/**/
|
||||||
1439,
|
1439,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user