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

patch 8.1.0466: autocmd test fails

Problem:    Autocmd test fails.
Solution:   Do call inchar() when flushing typeahead.
This commit is contained in:
Bram Moolenaar
2018-10-07 23:16:36 +02:00
parent 95ba5c364f
commit 6a2633b00b
7 changed files with 34 additions and 22 deletions

View File

@@ -438,7 +438,7 @@ typeahead_noflush(int c)
* flush all typeahead characters (used when interrupted by a CTRL-C). * flush all typeahead characters (used when interrupted by a CTRL-C).
*/ */
void void
flush_buffers(int flush_typeahead) flush_buffers(flush_buffers_T flush_typeahead)
{ {
init_typebuf(); init_typebuf();
@@ -446,15 +446,21 @@ flush_buffers(int flush_typeahead)
while (read_readbuffers(TRUE) != NUL) while (read_readbuffers(TRUE) != NUL)
; ;
if (flush_typeahead) /* remove all typeahead */ if (flush_typeahead == FLUSH_MINIMAL)
{ {
/* // remove mapped characters at the start only
* We have to get all characters, because we may delete the first part typebuf.tb_off += typebuf.tb_maplen;
* of an escape sequence. typebuf.tb_len -= typebuf.tb_maplen;
* In an xterm we get one char at a time and we have to get them all. }
*/ else
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_off = MAXMAPLEN;
typebuf.tb_len = 0; typebuf.tb_len = 0;
#if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL) #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL)
@@ -463,11 +469,6 @@ flush_buffers(int flush_typeahead)
typebuf_was_filled = FALSE; typebuf_was_filled = FALSE;
#endif #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_maplen = 0;
typebuf.tb_silent = 0; typebuf.tb_silent = 0;
cmd_silent = FALSE; cmd_silent = FALSE;
@@ -1858,6 +1859,7 @@ plain_vgetc(void)
* Check if a character is available, such that vgetc() will not block. * 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 * If the next character is a special character or multi-byte, the returned
* character is not valid!. * character is not valid!.
* Returns NUL if no character is available.
*/ */
int int
vpeekc(void) vpeekc(void)
@@ -1956,7 +1958,8 @@ vungetc(int c)
* KeyTyped is set to TRUE in the case the user typed the key. * KeyTyped is set to TRUE in the case the user typed the key.
* KeyStuffed is TRUE if the character comes from the stuff buffer. * KeyStuffed is TRUE if the character comes from the stuff buffer.
* if "advance" is FALSE (vpeekc()): * 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. * When "no_mapping" is zero, checks for mappings in the current mode.
* Only returns one byte (of a multi-byte character). * Only returns one byte (of a multi-byte character).
@@ -2084,7 +2087,7 @@ vgetorpeek(int advance)
c = ESC; c = ESC;
else else
c = Ctrl_C; c = Ctrl_C;
flush_buffers(TRUE); /* flush all typeahead */ flush_buffers(FLUSH_INPUT); // flush all typeahead
if (advance) if (advance)
{ {
@@ -2510,7 +2513,7 @@ vgetorpeek(int advance)
redrawcmdline(); redrawcmdline();
else else
setcursor(); setcursor();
flush_buffers(FALSE); flush_buffers(FLUSH_MINIMAL);
mapdepth = 0; /* for next one */ mapdepth = 0; /* for next one */
c = -1; c = -1;
break; break;

View File

@@ -4522,7 +4522,7 @@ findswapname(
// If vimrc has "simalt ~x" we don't want it to // If vimrc has "simalt ~x" we don't want it to
// interfere with the prompt here. // interfere with the prompt here.
flush_buffers(TRUE); flush_buffers(FLUSH_TYPEAHEAD);
} }
#if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)

View File

@@ -688,8 +688,8 @@ emsg(char_u *s)
if (p_eb) if (p_eb)
beep_flush(); /* also includes flush_buffers() */ beep_flush(); /* also includes flush_buffers() */
else else
flush_buffers(FALSE); /* flush internal buffers */ flush_buffers(FLUSH_MINIMAL); // flush internal buffers
did_emsg = TRUE; /* flag for DoOneCmd() */ did_emsg = TRUE; // flag for DoOneCmd()
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
did_uncaught_emsg = TRUE; did_uncaught_emsg = TRUE;
#endif #endif

View File

@@ -3825,7 +3825,7 @@ beep_flush(void)
{ {
if (emsg_silent == 0) if (emsg_silent == 0)
{ {
flush_buffers(FALSE); flush_buffers(FLUSH_MINIMAL);
vim_beep(BO_ERROR); vim_beep(BO_ERROR);
} }
} }

View File

@@ -5,7 +5,7 @@ char_u *get_inserted(void);
int stuff_empty(void); int stuff_empty(void);
int readbuf1_empty(void); int readbuf1_empty(void);
void typeahead_noflush(int c); void typeahead_noflush(int c);
void flush_buffers(int flush_typeahead); void flush_buffers(flush_buffers_T flush_typeahead);
void ResetRedobuff(void); void ResetRedobuff(void);
void CancelRedo(void); void CancelRedo(void);
void saveRedobuff(save_redo_T *save_redo); void saveRedobuff(save_redo_T *save_redo);

View File

@@ -792,6 +792,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 */
/**/
466,
/**/ /**/
465, 465,
/**/ /**/

View File

@@ -2108,6 +2108,13 @@ typedef enum {
PASTE_ONE_CHAR /* return first character */ PASTE_ONE_CHAR /* return first character */
} paste_mode_T; } 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 "ex_cmds.h" /* Ex command defines */
#include "spell.h" /* spell checking stuff */ #include "spell.h" /* spell checking stuff */