]> granicus.if.org Git - vim/commitdiff
patch 9.0.0575: the getchar() function behaves strangely with bracketed paste v9.0.0575
authorBram Moolenaar <Bram@vim.org>
Sat, 24 Sep 2022 14:36:35 +0000 (15:36 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 24 Sep 2022 14:36:35 +0000 (15:36 +0100)
Problem:    The getchar() function behaves strangely with bracketed paste.
Solution:   Do not handle paste-start in getchar(). (issue #11172)

src/getchar.c
src/version.c

index d49c02635b4e05b8656dc8df85256810d7292260..124a610d209382d651a12edc982f3b4edaf19d3a 100644 (file)
@@ -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();
index 5057877b991c71034d813518d6ae2b0a236e1a17..376f10fa851f71974a1093edb2642405a42ef2ae 100644 (file)
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    575,
 /**/
     574,
 /**/