From: Bram Moolenaar Date: Sat, 24 Sep 2022 14:36:35 +0000 (+0100) Subject: patch 9.0.0575: the getchar() function behaves strangely with bracketed paste X-Git-Tag: v9.0.0575 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=78aed95c8d11a06590abb079014887a458b28b36;p=vim patch 9.0.0575: the getchar() function behaves strangely with bracketed paste Problem: The getchar() function behaves strangely with bracketed paste. Solution: Do not handle paste-start in getchar(). (issue #11172) --- diff --git a/src/getchar.c b/src/getchar.c index d49c02635..124a610d2 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -1720,6 +1720,8 @@ vgetc(void) { int did_inc = FALSE; + // No mapping after modifier has been read, using an input method + // and when a popup window has disabled mapping. if (mod_mask #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) || im_is_preediting() @@ -1729,10 +1731,10 @@ vgetc(void) #endif ) { - // no mapping after modifier has been read ++no_mapping; ++allow_keys; - did_inc = TRUE; // mod_mask may change value + // mod_mask value may change, remember we did the increment + did_inc = TRUE; } c = vgetorpeek(TRUE); if (did_inc) @@ -1988,9 +1990,10 @@ safe_vgetc(void) /* * Like safe_vgetc(), but loop to handle K_IGNORE. * Also ignore scrollbar events. + * Does not handle bracketed paste - do not use the result for commands. */ - int -plain_vgetc(void) + static int +plain_vgetc_nopaste(void) { int c; @@ -1999,6 +2002,17 @@ plain_vgetc(void) while (c == K_IGNORE || c == K_VER_SCROLLBAR || c == K_HOR_SCROLLBAR || c == K_MOUSEMOVE); + return c; +} + +/* + * Like safe_vgetc(), but loop to handle K_IGNORE. + * Also ignore scrollbar events. + */ + int +plain_vgetc(void) +{ + int c = plain_vgetc_nopaste(); if (c == K_PS) // Only handle the first pasted character. Drop the rest, since we @@ -2107,7 +2121,7 @@ getchar_common(typval_T *argvars, typval_T *rettv) { if (argvars[0].v_type == VAR_UNKNOWN) // getchar(): blocking wait. - n = plain_vgetc(); + n = plain_vgetc_nopaste(); else if (tv_get_bool_chk(&argvars[0], &error)) // getchar(1): only check if char avail n = vpeekc_any(); diff --git a/src/version.c b/src/version.c index 5057877b9..376f10fa8 100644 --- a/src/version.c +++ b/src/version.c @@ -699,6 +699,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 575, /**/ 574, /**/