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
index 679eae1..53c0ef3 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -438,7 +438,7 @@
* 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 @@
while (read_readbuffers(TRUE) != NUL)
;
- if (flush_typeahead) /* remove all typeahead */
+ if (flush_typeahead == FLUSH_MINIMAL)
{
- /*
- * 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 mapped characters at the start only
+ typebuf.tb_off += typebuf.tb_maplen;
+ typebuf.tb_len -= typebuf.tb_maplen;
+ }
+ else
+ {
+ // 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 @@
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 @@
* 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 @@
* 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 @@
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 @@
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
index f7a3d06..0881e6c 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -4522,7 +4522,7 @@
// 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
index c7ecb61..c2318bd 100644
--- a/src/message.c
+++ b/src/message.c
@@ -688,8 +688,8 @@
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
index 34b4134..820f8f9 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -3825,7 +3825,7 @@
{
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
index aac522f..0733662 100644
--- a/src/proto/getchar.pro
+++ b/src/proto/getchar.pro
@@ -5,7 +5,7 @@
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
index 9f4991a..c416032 100644
--- a/src/version.c
+++ b/src/version.c
@@ -793,6 +793,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 466,
+/**/
465,
/**/
464,
diff --git a/src/vim.h b/src/vim.h
index cb72711..7a66ab0 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2108,6 +2108,13 @@
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 */