Merge #9098 'vim-patch:8.1.{459,463,466}'

This commit is contained in:
Justin M. Keyes 2018-10-09 09:02:26 +02:00 committed by GitHub
commit 85e8fd96f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 39 additions and 23 deletions

View File

@ -420,7 +420,7 @@ void typeahead_noflush(int c)
* typeahead buffer (used in case of an error). If "flush_typeahead" is true, * typeahead buffer (used in case of an error). If "flush_typeahead" is true,
* flush all typeahead characters (used when interrupted by a CTRL-C). * 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(); init_typebuf();
@ -428,22 +428,24 @@ void 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 {
*/ // remove typeahead
while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L) != 0) { 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;
// Reset the flag that text received from a client or from feedkeys() // Reset the flag that text received from a client or from feedkeys()
// was inserted in the typeahead buffer. // was inserted in the typeahead buffer.
typebuf_was_filled = false; 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_maplen = 0;
typebuf.tb_silent = 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. * 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 vpeekc(void) 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. /// 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` (global) is zero, checks for mappings in the current mode. /// When `no_mapping` (global) 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).
@ -1709,7 +1713,7 @@ static int vgetorpeek(int advance)
} 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) {
/* Also record this character, it might be needed to /* Also record this character, it might be needed to
@ -1970,8 +1974,8 @@ static int 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

@ -16,6 +16,13 @@ enum {
REMAP_SKIP = -3, ///< No remapping for first char. REMAP_SKIP = -3, ///< No remapping for first char.
} RemapValues; } 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_KEY -1 /* keylen value for incomplete key-code */
#define KEYLEN_PART_MAP -2 /* keylen value for incomplete mapping */ #define KEYLEN_PART_MAP -2 /* keylen value for incomplete mapping */
#define KEYLEN_REMOVED 9999 /* keylen value for removed sequence */ #define KEYLEN_REMOVED 9999 /* keylen value for removed sequence */

View File

@ -49,6 +49,7 @@
#include "nvim/buffer.h" #include "nvim/buffer.h"
#include "nvim/cursor.h" #include "nvim/cursor.h"
#include "nvim/eval.h" #include "nvim/eval.h"
#include "nvim/getchar.h"
#include "nvim/fileio.h" #include "nvim/fileio.h"
#include "nvim/func_attr.h" #include "nvim/func_attr.h"
#include "nvim/main.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); choice = do_swapexists(buf, (char_u *) fname);
if (choice == 0) { if (choice == 0) {
/* Show info about the existing swap file. */ // Show info about the existing swap file.
attention_message(buf, (char_u *) fname); attention_message(buf, (char_u *)fname);
/* We don't want a 'q' typed at the more-prompt // We don't want a 'q' typed at the more-prompt
* interrupt loading a file. */ // interrupt loading a file.
got_int = FALSE; 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) { if (swap_exists_action != SEA_NONE && choice == 0) {

View File

@ -552,7 +552,7 @@ int emsg(const 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()
} }

View File

@ -2548,7 +2548,7 @@ void msgmore(long n)
void beep_flush(void) void 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

@ -873,7 +873,7 @@ func Test_Executable()
call assert_equal(1, executable('win.ini')) call assert_equal(1, executable('win.ini'))
elseif has('unix') elseif has('unix')
call assert_equal(1, executable('cat')) call assert_equal(1, executable('cat'))
call assert_equal(0, executable('dog')) call assert_equal(0, executable('nodogshere'))
endif endif
endfunc endfunc