# HG changeset patch # User Bram Moolenaar # Date 1664030702 -7200 # Node ID cabceac53adeb6761e1dcb793ca8d7c68072fce9 # Parent ecb85ad746ffe86ee5dcbd1728d168a4f43632e0 patch 9.0.0575: the getchar() function behaves strangely with bracketed paste Commit: https://github.com/vim/vim/commit/78aed95c8d11a06590abb079014887a458b28b36 Author: Bram Moolenaar Date: Sat Sep 24 15:36:35 2022 +0100 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 https://github.com/vim/vim/issues/11172) diff --git a/src/getchar.c b/src/getchar.c --- 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 { 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 --- a/src/version.c +++ b/src/version.c @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 575, +/**/ 574, /**/ 573,