0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.3828: when opening a terminal from a timer first typed char is lost

Problem:    when opening a terminal from a timer the first typed character
            is lost. (Virginia Senioria)
Solution:   When opening a terminal while waiting for a character put K_IGNORE
            in the input buffer.
This commit is contained in:
Bram Moolenaar 2021-12-16 18:02:07 +00:00
parent f79cbf6512
commit 8103527da7
4 changed files with 52 additions and 2 deletions

View File

@ -598,9 +598,14 @@ edit(
{
c = safe_vgetc();
if (stop_insert_mode)
if (stop_insert_mode
#ifdef FEAT_TERMINAL
|| (c == K_IGNORE && term_use_loop())
#endif
)
{
// Insert mode ended, possibly from a callback.
// Insert mode ended, possibly from a callback, or a timer
// must have opened a terminal window.
if (c != K_IGNORE && c != K_NOP)
vungetc(c);
count = 0;

View File

@ -739,6 +739,23 @@ term_start(
curwin->w_buffer = curbuf;
++curbuf->b_nwindows;
}
else if (vgetc_busy
#ifdef FEAT_TIMERS
|| timer_busy
#endif
|| input_busy)
{
char_u ignore[4];
// When waiting for input need to return and possibly end up in
// terminal_loop() instead.
ignore[0] = K_SPECIAL;
ignore[1] = KS_EXTRA;
ignore[2] = KE_IGNORE;
ignore[3] = NUL;
ins_typebuf(ignore, REMAP_NONE, 0, TRUE, FALSE);
typebuf_was_filled = TRUE;
}
}
else
{

View File

@ -1596,6 +1596,7 @@ endfunc
" 4. 0.5 sec later: should be done, clean up
func Test_terminal_statusline()
CheckUnix
CheckFeature timers
set statusline=x
terminal
@ -1611,6 +1612,31 @@ func Test_terminal_statusline()
set statusline=
endfunc
func CheckTerminalWindowWorks(buf)
call WaitForAssert({-> assert_match('!sh \[running\]', term_getline(a:buf, 10))})
call term_sendkeys(a:buf, "exit\<CR>")
call WaitForAssert({-> assert_match('!sh \[finished\]', term_getline(a:buf, 10))})
call term_sendkeys(a:buf, ":q\<CR>")
call WaitForAssert({-> assert_match('^\~', term_getline(a:buf, 10))})
endfunc
func Test_start_terminal_from_timer()
CheckUnix
CheckFeature timers
" Open a terminal window from a timer, typed text goes to the terminal
call writefile(["call timer_start(100, { -> term_start('sh') })"], 'XtimerTerm')
let buf = RunVimInTerminal('-S XtimerTerm', {})
call CheckTerminalWindowWorks(buf)
" do the same in Insert mode
call term_sendkeys(buf, ":call timer_start(200, { -> term_start('sh') })\<CR>a")
call CheckTerminalWindowWorks(buf)
call StopVimInTerminal(buf)
call delete('XtimerTerm')
endfunc
func Test_terminal_window_focus()
let winid1 = win_getid()
terminal

View File

@ -749,6 +749,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3828,
/**/
3827,
/**/