summaryrefslogtreecommitdiff
path: root/src/getchar.c
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 /src/getchar.c
parent95ba5c364f097121b95879896b05ec737ecafd1c (diff)
downloadvim-git-6a2633b00bb00bcf0d994f08d1c54ace2c221b58.tar.gz
patch 8.1.0466: autocmd test failsv8.1.0466
Problem: Autocmd test fails. Solution: Do call inchar() when flushing typeahead.
Diffstat (limited to 'src/getchar.c')
-rw-r--r--src/getchar.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/src/getchar.c b/src/getchar.c
index 679eae160..53c0ef35b 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;