mirror of
https://github.com/vim/vim.git
synced 2025-07-04 23:07:33 -04:00
patch 8.0.1786: no test for 'termwinkey'
Problem: No test for 'termwinkey'. Solution: Add a test. Make feedkeys() handle terminal_loop() returning before characters are consumed.
This commit is contained in:
parent
8a938af6dd
commit
b2ac14c0b5
@ -3311,18 +3311,12 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED)
|
|||||||
/* Avoid a 1 second delay when the keys start Insert mode. */
|
/* Avoid a 1 second delay when the keys start Insert mode. */
|
||||||
msg_scroll = FALSE;
|
msg_scroll = FALSE;
|
||||||
|
|
||||||
#ifdef FEAT_TERMINAL
|
if (!dangerous)
|
||||||
if (term_use_loop())
|
++ex_normal_busy;
|
||||||
terminal_loop(FALSE);
|
exec_normal(TRUE);
|
||||||
else
|
if (!dangerous)
|
||||||
#endif
|
--ex_normal_busy;
|
||||||
{
|
|
||||||
if (!dangerous)
|
|
||||||
++ex_normal_busy;
|
|
||||||
exec_normal(TRUE);
|
|
||||||
if (!dangerous)
|
|
||||||
--ex_normal_busy;
|
|
||||||
}
|
|
||||||
msg_scroll |= save_msg_scroll;
|
msg_scroll |= save_msg_scroll;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10340,7 +10340,21 @@ exec_normal(int was_typed)
|
|||||||
&& typebuf.tb_len > 0)) && !got_int)
|
&& typebuf.tb_len > 0)) && !got_int)
|
||||||
{
|
{
|
||||||
update_topline_cursor();
|
update_topline_cursor();
|
||||||
normal_cmd(&oa, TRUE); /* execute a Normal mode cmd */
|
#ifdef FEAT_TERMINAL
|
||||||
|
if (term_use_loop()
|
||||||
|
&& oa.op_type == OP_NOP && oa.regname == NUL
|
||||||
|
&& !VIsual_active)
|
||||||
|
{
|
||||||
|
/* If terminal_loop() returns OK we got a key that is handled
|
||||||
|
* in Normal model. With FAIL we first need to position the
|
||||||
|
* cursor and the screen needs to be redrawn. */
|
||||||
|
if (terminal_loop(TRUE) == OK)
|
||||||
|
normal_cmd(&oa, TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
/* execute a Normal mode cmd */
|
||||||
|
normal_cmd(&oa, TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2059,7 +2059,7 @@ vgetorpeek(int advance)
|
|||||||
c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L);
|
c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L);
|
||||||
/*
|
/*
|
||||||
* If inchar() returns TRUE (script file was active) or we
|
* If inchar() returns TRUE (script file was active) or we
|
||||||
* are inside a mapping, get out of insert mode.
|
* are inside a mapping, get out of Insert mode.
|
||||||
* Otherwise we behave like having gotten a CTRL-C.
|
* Otherwise we behave like having gotten a CTRL-C.
|
||||||
* As a result typing CTRL-C in insert mode will
|
* As a result typing CTRL-C in insert mode will
|
||||||
* really insert a CTRL-C.
|
* really insert a CTRL-C.
|
||||||
@ -2755,6 +2755,10 @@ vgetorpeek(int advance)
|
|||||||
* cmdline window. */
|
* cmdline window. */
|
||||||
if (p_im && (State & INSERT))
|
if (p_im && (State & INSERT))
|
||||||
c = Ctrl_L;
|
c = Ctrl_L;
|
||||||
|
#ifdef FEAT_TERMINAL
|
||||||
|
else if (terminal_is_active())
|
||||||
|
c = K_CANCEL;
|
||||||
|
#endif
|
||||||
else if ((State & CMDLINE)
|
else if ((State & CMDLINE)
|
||||||
#ifdef FEAT_CMDWIN
|
#ifdef FEAT_CMDWIN
|
||||||
|| (cmdwin_type > 0 && tc == ESC)
|
|| (cmdwin_type > 0 && tc == ESC)
|
||||||
@ -2898,8 +2902,8 @@ vgetorpeek(int advance)
|
|||||||
} /* for (;;) */
|
} /* for (;;) */
|
||||||
} /* if (!character from stuffbuf) */
|
} /* if (!character from stuffbuf) */
|
||||||
|
|
||||||
/* if advance is FALSE don't loop on NULs */
|
/* if advance is FALSE don't loop on NULs */
|
||||||
} while (c < 0 || (advance && c == NUL));
|
} while ((c < 0 && c != K_CANCEL) || (advance && c == NUL));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The "INSERT" message is taken care of here:
|
* The "INSERT" message is taken care of here:
|
||||||
|
@ -270,6 +270,7 @@ enum key_extra
|
|||||||
, KE_FOCUSGAINED = 98 /* focus gained */
|
, KE_FOCUSGAINED = 98 /* focus gained */
|
||||||
, KE_FOCUSLOST = 99 /* focus lost */
|
, KE_FOCUSLOST = 99 /* focus lost */
|
||||||
, KE_MOUSEMOVE = 100 /* mouse moved with no button down */
|
, KE_MOUSEMOVE = 100 /* mouse moved with no button down */
|
||||||
|
, KE_CANCEL = 101 /* return from vgetc() */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -455,6 +456,7 @@ enum key_extra
|
|||||||
|
|
||||||
#define K_IGNORE TERMCAP2KEY(KS_EXTRA, KE_IGNORE)
|
#define K_IGNORE TERMCAP2KEY(KS_EXTRA, KE_IGNORE)
|
||||||
#define K_NOP TERMCAP2KEY(KS_EXTRA, KE_NOP)
|
#define K_NOP TERMCAP2KEY(KS_EXTRA, KE_NOP)
|
||||||
|
#define K_CANCEL TERMCAP2KEY(KS_EXTRA, KE_CANCEL)
|
||||||
|
|
||||||
#define K_MOUSEDOWN TERMCAP2KEY(KS_EXTRA, KE_MOUSEDOWN)
|
#define K_MOUSEDOWN TERMCAP2KEY(KS_EXTRA, KE_MOUSEDOWN)
|
||||||
#define K_MOUSEUP TERMCAP2KEY(KS_EXTRA, KE_MOUSEUP)
|
#define K_MOUSEUP TERMCAP2KEY(KS_EXTRA, KE_MOUSEUP)
|
||||||
|
@ -42,7 +42,6 @@
|
|||||||
* redirection. Probably in call to channel_set_pipes().
|
* redirection. Probably in call to channel_set_pipes().
|
||||||
* - Win32: Redirecting output does not work, Test_terminal_redir_file()
|
* - Win32: Redirecting output does not work, Test_terminal_redir_file()
|
||||||
* is disabled.
|
* is disabled.
|
||||||
* - Add test for 'termwinkey'.
|
|
||||||
* - When starting terminal window with shell in terminal, then using :gui to
|
* - When starting terminal window with shell in terminal, then using :gui to
|
||||||
* switch to GUI, shell stops working. Scrollback seems wrong, command
|
* switch to GUI, shell stops working. Scrollback seems wrong, command
|
||||||
* running in shell is still running.
|
* running in shell is still running.
|
||||||
@ -1690,6 +1689,7 @@ send_keys_to_term(term_T *term, int c, int typed)
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
case K_IGNORE:
|
case K_IGNORE:
|
||||||
|
case K_CANCEL: // used for :normal when running out of chars
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
case K_LEFTDRAG:
|
case K_LEFTDRAG:
|
||||||
@ -1826,9 +1826,9 @@ term_paste_register(int prev_c UNUSED)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(FEAT_GUI) || defined(PROTO)
|
|
||||||
/*
|
/*
|
||||||
* Return TRUE when the cursor of the terminal should be displayed.
|
* Return TRUE when waiting for a character in the terminal, the cursor of the
|
||||||
|
* terminal should be displayed.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
terminal_is_active()
|
terminal_is_active()
|
||||||
@ -1836,6 +1836,7 @@ terminal_is_active()
|
|||||||
return in_terminal_loop != NULL;
|
return in_terminal_loop != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(FEAT_GUI) || defined(PROTO)
|
||||||
cursorentry_T *
|
cursorentry_T *
|
||||||
term_get_cursor_shape(guicolor_T *fg, guicolor_T *bg)
|
term_get_cursor_shape(guicolor_T *fg, guicolor_T *bg)
|
||||||
{
|
{
|
||||||
|
@ -1471,3 +1471,19 @@ func Test_terminal_termwinsize_mininmum()
|
|||||||
|
|
||||||
set termwinsize=
|
set termwinsize=
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_terminal_termwinkey()
|
||||||
|
call assert_equal(1, winnr('$'))
|
||||||
|
let thiswin = win_getid()
|
||||||
|
|
||||||
|
let buf = Run_shell_in_terminal({})
|
||||||
|
let termwin = bufwinid(buf)
|
||||||
|
set termwinkey=<C-L>
|
||||||
|
call feedkeys("\<C-L>w", 'tx')
|
||||||
|
call assert_equal(thiswin, win_getid())
|
||||||
|
call feedkeys("\<C-W>w", 'tx')
|
||||||
|
|
||||||
|
let job = term_getjob(buf)
|
||||||
|
call feedkeys("\<C-L>\<C-C>", 'tx')
|
||||||
|
call WaitForAssert({-> assert_equal("dead", job_status(job))})
|
||||||
|
endfunc
|
||||||
|
@ -761,6 +761,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 */
|
||||||
|
/**/
|
||||||
|
1786,
|
||||||
/**/
|
/**/
|
||||||
1785,
|
1785,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user