mirror of
https://github.com/neovim/neovim.git
synced 2024-12-20 11:15:14 -07:00
Merge #8888 from janlazo/vim-8.0.1020
This commit is contained in:
commit
bfe82d4650
@ -434,9 +434,8 @@ void flush_buffers(int flush_typeahead)
|
||||
* of an escape sequence.
|
||||
* In an xterm we get one char at a time and we have to get them all.
|
||||
*/
|
||||
while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L,
|
||||
typebuf.tb_change_cnt) != 0)
|
||||
;
|
||||
while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L) != 0) {
|
||||
}
|
||||
typebuf.tb_off = MAXMAPLEN;
|
||||
typebuf.tb_len = 0;
|
||||
// Reset the flag that text received from a client or from feedkeys()
|
||||
@ -1697,22 +1696,20 @@ static int vgetorpeek(int advance)
|
||||
os_breakcheck(); /* check for CTRL-C */
|
||||
keylen = 0;
|
||||
if (got_int) {
|
||||
/* flush all input */
|
||||
c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L,
|
||||
typebuf.tb_change_cnt);
|
||||
/*
|
||||
* If inchar() returns TRUE (script file was active) or we
|
||||
* are inside a mapping, get out of insert mode.
|
||||
* Otherwise we behave like having gotten a CTRL-C.
|
||||
* As a result typing CTRL-C in insert mode will
|
||||
* really insert a CTRL-C.
|
||||
*/
|
||||
// flush all input
|
||||
c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L);
|
||||
// If inchar() returns TRUE (script file was active) or we
|
||||
// are inside a mapping, get out of insert mode.
|
||||
// Otherwise we behave like having gotten a CTRL-C.
|
||||
// As a result typing CTRL-C in insert mode will
|
||||
// really insert a CTRL-C.
|
||||
if ((c || typebuf.tb_maplen)
|
||||
&& (State & (INSERT + CMDLINE)))
|
||||
&& (State & (INSERT + CMDLINE))) {
|
||||
c = ESC;
|
||||
else
|
||||
} else {
|
||||
c = Ctrl_C;
|
||||
flush_buffers(TRUE); /* flush all typeahead */
|
||||
}
|
||||
flush_buffers(true); // flush all typeahead
|
||||
|
||||
if (advance) {
|
||||
/* Also record this character, it might be needed to
|
||||
@ -2075,18 +2072,17 @@ static int vgetorpeek(int advance)
|
||||
c = 0;
|
||||
new_wcol = curwin->w_wcol;
|
||||
new_wrow = curwin->w_wrow;
|
||||
if ( advance
|
||||
&& typebuf.tb_len == 1
|
||||
&& typebuf.tb_buf[typebuf.tb_off] == ESC
|
||||
&& !no_mapping
|
||||
&& ex_normal_busy == 0
|
||||
&& typebuf.tb_maplen == 0
|
||||
&& (State & INSERT)
|
||||
&& (p_timeout
|
||||
|| (keylen == KEYLEN_PART_KEY && p_ttimeout))
|
||||
&& (c = inchar(typebuf.tb_buf + typebuf.tb_off
|
||||
+ typebuf.tb_len, 3, 25L,
|
||||
typebuf.tb_change_cnt)) == 0) {
|
||||
if (advance
|
||||
&& typebuf.tb_len == 1
|
||||
&& typebuf.tb_buf[typebuf.tb_off] == ESC
|
||||
&& !no_mapping
|
||||
&& ex_normal_busy == 0
|
||||
&& typebuf.tb_maplen == 0
|
||||
&& (State & INSERT)
|
||||
&& (p_timeout
|
||||
|| (keylen == KEYLEN_PART_KEY && p_ttimeout))
|
||||
&& (c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len,
|
||||
3, 25L)) == 0) {
|
||||
colnr_T col = 0, vcol;
|
||||
char_u *ptr;
|
||||
|
||||
@ -2258,6 +2254,11 @@ static int vgetorpeek(int advance)
|
||||
/*
|
||||
* get a character: 3. from the user - get it
|
||||
*/
|
||||
if (typebuf.tb_len == 0) {
|
||||
// timedout may have been set while waiting for a mapping
|
||||
// that has a <Nop> RHS.
|
||||
timedout = false;
|
||||
}
|
||||
wait_tb_len = typebuf.tb_len;
|
||||
c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len,
|
||||
typebuf.tb_buflen - typebuf.tb_off - typebuf.tb_len - 1,
|
||||
@ -2269,7 +2270,7 @@ static int vgetorpeek(int advance)
|
||||
? -1L
|
||||
: ((keylen == KEYLEN_PART_KEY && p_ttm >= 0)
|
||||
? p_ttm
|
||||
: p_tm)), typebuf.tb_change_cnt);
|
||||
: p_tm)));
|
||||
|
||||
if (i != 0)
|
||||
pop_showcmd();
|
||||
@ -2350,16 +2351,15 @@ static int vgetorpeek(int advance)
|
||||
* Return the number of obtained characters.
|
||||
* Return -1 when end of input script reached.
|
||||
*/
|
||||
int
|
||||
inchar (
|
||||
int inchar(
|
||||
char_u *buf,
|
||||
int maxlen,
|
||||
long wait_time, /* milli seconds */
|
||||
int tb_change_cnt
|
||||
long wait_time // milli seconds
|
||||
)
|
||||
{
|
||||
int len = 0; // Init for GCC.
|
||||
int retesc = false; // Return ESC with gotint.
|
||||
const int tb_change_cnt = typebuf.tb_change_cnt;
|
||||
|
||||
if (wait_time == -1L || wait_time > 100L) {
|
||||
// flush output before waiting
|
||||
@ -2430,10 +2430,19 @@ inchar (
|
||||
len = os_inchar(buf, maxlen / 3, (int)wait_time, tb_change_cnt);
|
||||
}
|
||||
|
||||
// If the typebuf was changed further down, it is like nothing was added by
|
||||
// this call.
|
||||
if (typebuf_changed(tb_change_cnt)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Note the change in the typeahead buffer, this matters for when
|
||||
// vgetorpeek() is called recursively, e.g. using getchar(1) in a timer
|
||||
// function.
|
||||
if (len > 0 && ++typebuf.tb_change_cnt == 0) {
|
||||
typebuf.tb_change_cnt = 1;
|
||||
}
|
||||
|
||||
return fix_input_buffer(buf, len);
|
||||
}
|
||||
|
||||
|
@ -169,5 +169,25 @@ func Test_stop_all_in_callback()
|
||||
call assert_equal(0, len(info))
|
||||
endfunc
|
||||
|
||||
func FeedAndPeek(timer)
|
||||
call test_feedinput('a')
|
||||
call getchar(1)
|
||||
endfunc
|
||||
|
||||
func Interrupt(timer)
|
||||
call test_feedinput("\<C-C>")
|
||||
endfunc
|
||||
|
||||
func Test_peek_and_get_char()
|
||||
throw 'skipped: Nvim does not support test_feedinput()'
|
||||
if !has('unix') && !has('gui_running')
|
||||
return
|
||||
endif
|
||||
call timer_start(0, 'FeedAndPeek')
|
||||
let intr = timer_start(100, 'Interrupt')
|
||||
let c = getchar()
|
||||
call assert_equal(char2nr('a'), c)
|
||||
call timer_stop(intr)
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -96,6 +96,7 @@ describe('timers', function()
|
||||
source([[
|
||||
func! AddItem(timer)
|
||||
call nvim_buf_set_lines(0, 2, 2, v:true, ['ITEM 3'])
|
||||
call getchar(1)
|
||||
redraw
|
||||
endfunc
|
||||
call timer_start(200, 'AddItem')
|
||||
|
Loading…
Reference in New Issue
Block a user