Mercurial > vim
changeset 33662:664ee4c0daca v9.0.2069
patch 9.0.2069: possible to escape bracketed paste mode with Ctrl-C
Commit: https://github.com/vim/vim/commit/67ec6553839f070cd4cc8effa26a9db1750e17b6
Author: David Leadbeater <dgl@dgl.cx>
Date: Thu Oct 26 22:00:34 2023 +0200
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>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 26 Oct 2023 22:15:04 +0200 |
parents | 3966317e1cb4 |
children | e14a179650d8 |
files | src/getchar.c src/proto/getchar.pro src/ui.c src/version.c |
diffstat | 4 files changed, 9 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/getchar.c +++ b/src/getchar.c @@ -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.
--- a/src/proto/getchar.pro +++ b/src/proto/getchar.pro @@ -51,6 +51,7 @@ void f_getchar(typval_T *argvars, typval 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);
--- a/src/ui.c +++ b/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,