summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-10-07 23:16:36 +0200
committerBram Moolenaar <Bram@vim.org>2018-10-07 23:16:36 +0200
commit6a2633b00bb00bcf0d994f08d1c54ace2c221b58 (patch)
treea319f2692684a8f44d912d84029286889ba8b83e
parent95ba5c364f097121b95879896b05ec737ecafd1c (diff)
patch 8.1.0466: autocmd test failsv8.1.0466
Problem: Autocmd test fails. Solution: Do call inchar() when flushing typeahead.
-rw-r--r--src/getchar.c37
-rw-r--r--src/memline.c2
-rw-r--r--src/message.c4
-rw-r--r--src/misc1.c2
-rw-r--r--src/proto/getchar.pro2
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h7
7 files changed, 34 insertions, 22 deletions
diff --git a/src/getchar.c b/src/getchar.c
index 679eae1603..53c0ef35bf 100644
--- 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)
{
- /*
- * 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 @@ 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
index f7a3d06a71..0881e6c7ad 100644
--- 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
index c7ecb61963..c2318bd8af 100644
--- 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
index 34b4134a04..820f8f994f 100644
--- 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
index aac522f152..07336627fc 100644
--- 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
index 9f4991aa66..c416032f56 100644
--- 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
index cb72711cc2..7a66ab0e29 100644
--- 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 */