aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2018-10-09 09:02:26 +0200
committerGitHub <noreply@github.com>2018-10-09 09:02:26 +0200
commit85e8fd96f4e04184cf22b691ea2229de901f4e4c (patch)
tree7c27931728dedf33b7f733175e6c1015d848361c
parent05cbe0da30fa9455da7d2663e6c5b57876e55fd1 (diff)
parentf181efdeaf07a788203b60a2df915118eeb6f0fc (diff)
downloadrneovim-85e8fd96f4e04184cf22b691ea2229de901f4e4c.tar.gz
rneovim-85e8fd96f4e04184cf22b691ea2229de901f4e4c.tar.bz2
rneovim-85e8fd96f4e04184cf22b691ea2229de901f4e4c.zip
Merge #9098 'vim-patch:8.1.{459,463,466}'
-rw-r--r--src/nvim/getchar.c34
-rw-r--r--src/nvim/getchar.h7
-rw-r--r--src/nvim/memline.c15
-rw-r--r--src/nvim/message.c2
-rw-r--r--src/nvim/misc1.c2
-rw-r--r--src/nvim/testdir/test_functions.vim2
6 files changed, 39 insertions, 23 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 2eb2df399e..94702a9a3a 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -420,7 +420,7 @@ void typeahead_noflush(int c)
* typeahead buffer (used in case of an error). If "flush_typeahead" is true,
* flush all typeahead characters (used when interrupted by a CTRL-C).
*/
-void flush_buffers(int flush_typeahead)
+void flush_buffers(flush_buffers_T flush_typeahead)
{
init_typebuf();
@@ -428,22 +428,24 @@ void flush_buffers(int flush_typeahead)
while (read_readbuffers(TRUE) != NUL) {
}
- if (flush_typeahead) { /* remove all typeahead */
- /*
- * 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) {
+ 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 {
+ // 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;
// Reset the flag that text received from a client or from feedkeys()
// was inserted in the typeahead buffer.
typebuf_was_filled = false;
- } 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;
@@ -1538,6 +1540,7 @@ int 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)
{
@@ -1602,7 +1605,8 @@ vungetc ( /* unget one character (can only be done once!) */
/// 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` (global) is zero, checks for mappings in the current mode.
/// Only returns one byte (of a multi-byte character).
@@ -1709,7 +1713,7 @@ static int vgetorpeek(int advance)
} else {
c = Ctrl_C;
}
- flush_buffers(true); // flush all typeahead
+ flush_buffers(FLUSH_INPUT); // flush all typeahead
if (advance) {
/* Also record this character, it might be needed to
@@ -1970,8 +1974,8 @@ static int vgetorpeek(int advance)
redrawcmdline();
else
setcursor();
- flush_buffers(FALSE);
- mapdepth = 0; /* for next one */
+ flush_buffers(FLUSH_MINIMAL);
+ mapdepth = 0; // for next one
c = -1;
break;
}
diff --git a/src/nvim/getchar.h b/src/nvim/getchar.h
index 38a2e75663..4f548d975a 100644
--- a/src/nvim/getchar.h
+++ b/src/nvim/getchar.h
@@ -16,6 +16,13 @@ enum {
REMAP_SKIP = -3, ///< No remapping for first char.
} RemapValues;
+// Argument for flush_buffers().
+typedef enum {
+ FLUSH_MINIMAL,
+ FLUSH_TYPEAHEAD, // flush current typebuf contents
+ FLUSH_INPUT // flush typebuf and inchar() input
+} flush_buffers_T;
+
#define KEYLEN_PART_KEY -1 /* keylen value for incomplete key-code */
#define KEYLEN_PART_MAP -2 /* keylen value for incomplete mapping */
#define KEYLEN_REMOVED 9999 /* keylen value for removed sequence */
diff --git a/src/nvim/memline.c b/src/nvim/memline.c
index ec0238e7c9..51f99db0de 100644
--- a/src/nvim/memline.c
+++ b/src/nvim/memline.c
@@ -49,6 +49,7 @@
#include "nvim/buffer.h"
#include "nvim/cursor.h"
#include "nvim/eval.h"
+#include "nvim/getchar.h"
#include "nvim/fileio.h"
#include "nvim/func_attr.h"
#include "nvim/main.h"
@@ -3358,12 +3359,16 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname,
choice = do_swapexists(buf, (char_u *) fname);
if (choice == 0) {
- /* Show info about the existing swap file. */
- attention_message(buf, (char_u *) fname);
+ // Show info about the existing swap file.
+ attention_message(buf, (char_u *)fname);
- /* We don't want a 'q' typed at the more-prompt
- * interrupt loading a file. */
- got_int = FALSE;
+ // We don't want a 'q' typed at the more-prompt
+ // interrupt loading a file.
+ got_int = false;
+
+ // If vimrc has "simalt ~x" we don't want it to
+ // interfere with the prompt here.
+ flush_buffers(FLUSH_TYPEAHEAD);
}
if (swap_exists_action != SEA_NONE && choice == 0) {
diff --git a/src/nvim/message.c b/src/nvim/message.c
index fc7396d318..1778e0048f 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -552,7 +552,7 @@ int emsg(const char_u *s_)
if (p_eb) {
beep_flush(); // also includes flush_buffers()
} else {
- flush_buffers(false); // flush internal buffers
+ flush_buffers(FLUSH_MINIMAL); // flush internal buffers
}
did_emsg = true; // flag for DoOneCmd()
}
diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c
index 2e7fe4d7a9..7e9d68a4b4 100644
--- a/src/nvim/misc1.c
+++ b/src/nvim/misc1.c
@@ -2548,7 +2548,7 @@ void msgmore(long n)
void beep_flush(void)
{
if (emsg_silent == 0) {
- flush_buffers(false);
+ flush_buffers(FLUSH_MINIMAL);
vim_beep(BO_ERROR);
}
}
diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim
index 4a27a119f3..b1138bfc96 100644
--- a/src/nvim/testdir/test_functions.vim
+++ b/src/nvim/testdir/test_functions.vim
@@ -873,7 +873,7 @@ func Test_Executable()
call assert_equal(1, executable('win.ini'))
elseif has('unix')
call assert_equal(1, executable('cat'))
- call assert_equal(0, executable('dog'))
+ call assert_equal(0, executable('nodogshere'))
endif
endfunc