Merge #8888 from janlazo/vim-8.0.1020

This commit is contained in:
Justin M. Keyes 2018-09-05 09:38:34 +02:00 committed by GitHub
commit bfe82d4650
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 63 additions and 33 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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')