# HG changeset patch # User Bram Moolenaar # Date 1538947806 -7200 # Node ID c97b4b537572bd9f167c43da52a20584d96c7c2d # Parent 2c102d67a1f059cd004dd14a21a077c63066fb99 patch 8.1.0466: autocmd test fails commit https://github.com/vim/vim/commit/6a2633b00bb00bcf0d994f08d1c54ace2c221b58 Author: Bram Moolenaar Date: Sun Oct 7 23:16:36 2018 +0200 patch 8.1.0466: autocmd test fails Problem: Autocmd test fails. Solution: Do call inchar() when flushing typeahead. diff --git a/src/getchar.c b/src/getchar.c --- a/src/getchar.c +++ b/src/getchar.c @@ -438,7 +438,7 @@ typeahead_noflush(int c) * flush all typeahead characters (used when interrupted by a CTRL-C). */ void -flush_buffers(int flush_typeahead) +flush_buffers(flush_buffers_T flush_typeahead) { init_typebuf(); @@ -446,15 +446,21 @@ flush_buffers(int flush_typeahead) while (read_readbuffers(TRUE) != NUL) ; - if (flush_typeahead) /* remove all typeahead */ + if (flush_typeahead == FLUSH_MINIMAL) + { + // remove mapped characters at the start only + typebuf.tb_off += typebuf.tb_maplen; + typebuf.tb_len -= typebuf.tb_maplen; + } + else { - /* - * We have to get all characters, because we may delete the first part - * 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) != 0) - ; + // remove typeahead + if (flush_typeahead == FLUSH_INPUT) + // We have to get all characters, because we may delete the first + // part 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) != 0) + ; typebuf.tb_off = MAXMAPLEN; typebuf.tb_len = 0; #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL) @@ -463,11 +469,6 @@ flush_buffers(int flush_typeahead) typebuf_was_filled = FALSE; #endif } - else /* remove mapped characters at the start only */ - { - typebuf.tb_off += typebuf.tb_maplen; - typebuf.tb_len -= typebuf.tb_maplen; - } typebuf.tb_maplen = 0; typebuf.tb_silent = 0; cmd_silent = FALSE; @@ -1858,6 +1859,7 @@ plain_vgetc(void) * Check if a character is available, such that vgetc() will not block. * If the next character is a special character or multi-byte, the returned * character is not valid!. + * Returns NUL if no character is available. */ int vpeekc(void) @@ -1956,7 +1958,8 @@ vungetc(int c) * KeyTyped is set to TRUE in the case the user typed the key. * KeyStuffed is TRUE if the character comes from the stuff buffer. * if "advance" is FALSE (vpeekc()): - * just look whether there is a character available. + * Just look whether there is a character available. + * Return NUL if not. * * When "no_mapping" is zero, checks for mappings in the current mode. * Only returns one byte (of a multi-byte character). @@ -2084,7 +2087,7 @@ vgetorpeek(int advance) c = ESC; else c = Ctrl_C; - flush_buffers(TRUE); /* flush all typeahead */ + flush_buffers(FLUSH_INPUT); // flush all typeahead if (advance) { @@ -2510,7 +2513,7 @@ vgetorpeek(int advance) redrawcmdline(); else setcursor(); - flush_buffers(FALSE); + flush_buffers(FLUSH_MINIMAL); mapdepth = 0; /* for next one */ c = -1; break; diff --git a/src/memline.c b/src/memline.c --- a/src/memline.c +++ b/src/memline.c @@ -4522,7 +4522,7 @@ findswapname( // If vimrc has "simalt ~x" we don't want it to // interfere with the prompt here. - flush_buffers(TRUE); + flush_buffers(FLUSH_TYPEAHEAD); } #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) diff --git a/src/message.c b/src/message.c --- a/src/message.c +++ b/src/message.c @@ -688,8 +688,8 @@ emsg(char_u *s) if (p_eb) beep_flush(); /* also includes flush_buffers() */ else - flush_buffers(FALSE); /* flush internal buffers */ - did_emsg = TRUE; /* flag for DoOneCmd() */ + flush_buffers(FLUSH_MINIMAL); // flush internal buffers + did_emsg = TRUE; // flag for DoOneCmd() #ifdef FEAT_EVAL did_uncaught_emsg = TRUE; #endif diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -3825,7 +3825,7 @@ beep_flush(void) { if (emsg_silent == 0) { - flush_buffers(FALSE); + flush_buffers(FLUSH_MINIMAL); vim_beep(BO_ERROR); } } diff --git a/src/proto/getchar.pro b/src/proto/getchar.pro --- a/src/proto/getchar.pro +++ b/src/proto/getchar.pro @@ -5,7 +5,7 @@ char_u *get_inserted(void); int stuff_empty(void); int readbuf1_empty(void); void typeahead_noflush(int c); -void flush_buffers(int flush_typeahead); +void flush_buffers(flush_buffers_T flush_typeahead); void ResetRedobuff(void); void CancelRedo(void); void saveRedobuff(save_redo_T *save_redo); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -793,6 +793,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 466, +/**/ 465, /**/ 464, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -2108,6 +2108,13 @@ typedef enum { PASTE_ONE_CHAR /* return first character */ } paste_mode_T; +// Argument for flush_buffers(). +typedef enum { + FLUSH_MINIMAL, + FLUSH_TYPEAHEAD, // flush current typebuf contents + FLUSH_INPUT // flush typebuf and inchar() input +} flush_buffers_T; + #include "ex_cmds.h" /* Ex command defines */ #include "spell.h" /* spell checking stuff */