forked from aniani/vim
patch 9.0.2069: possible to escape bracketed paste mode with Ctrl-C
Problem: possible to escape bracketed paste mode with Ctrl-C Solution: Do not handle Ctrl-C specially when key_protocol is in use, makes bracketed paste mode more robust When a key protocol is in use Ctrl-C will be sent as an escape sequence, but a raw Ctrl-C can be sent when pasting data. Pass this through, so that a Ctrl-C can be pasted and won't result in exiting insert mode (where the rest of the pasted keys can cause all kind of nasty side-effects). Many terminals will strip control characters in paste data (and xterm will strip ^C since version 388), but this provides some defense in depth if users change settings like xterm's allowPasteControls. closes: #13398 Signed-off-by: David Leadbeater <dgl@dgl.cx> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
parent
9198c1f2b1
commit
67ec655383
@ -2511,7 +2511,7 @@ check_simplify_modifier(int max_offset)
|
||||
* modifyOtherKeys level 2 is enabled or the kitty keyboard protocol is
|
||||
* enabled.
|
||||
*/
|
||||
static int
|
||||
int
|
||||
key_protocol_enabled(void)
|
||||
{
|
||||
// If xterm has responded to XTQMODKEYS it overrules seenModifyOtherKeys.
|
||||
|
@ -51,6 +51,7 @@ void f_getchar(typval_T *argvars, typval_T *rettv);
|
||||
void f_getcharstr(typval_T *argvars, typval_T *rettv);
|
||||
void f_getcharmod(typval_T *argvars, typval_T *rettv);
|
||||
void parse_queued_messages(void);
|
||||
int key_protocol_enabled(void);
|
||||
void vungetc(int c);
|
||||
int fix_input_buffer(char_u *buf, int len);
|
||||
int input_available(void);
|
||||
|
6
src/ui.c
6
src/ui.c
@ -1032,7 +1032,11 @@ fill_input_buf(int exit_on_error UNUSED)
|
||||
// If a CTRL-C was typed, remove it from the buffer and set
|
||||
// got_int. Also recognize CTRL-C with modifyOtherKeys set, lower
|
||||
// and upper case, in two forms.
|
||||
if (ctrl_c_interrupts && (inbuf[inbufcount] == 3
|
||||
// If terminal key protocols are in use, we expect to receive
|
||||
// Ctrl_C as an escape sequence, ignore a raw Ctrl_C as this could
|
||||
// be paste data.
|
||||
if (ctrl_c_interrupts
|
||||
&& ((inbuf[inbufcount] == Ctrl_C && !key_protocol_enabled())
|
||||
|| (len >= 10 && STRNCMP(inbuf + inbufcount,
|
||||
"\033[27;5;99~", 10) == 0)
|
||||
|| (len >= 10 && STRNCMP(inbuf + inbufcount,
|
||||
|
@ -704,6 +704,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
2069,
|
||||
/**/
|
||||
2068,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user