]> granicus.if.org Git - vim/commitdiff
patch 8.1.0224: hang in bracketed paste mode when t_PE not encountered v8.1.0224
authorBram Moolenaar <Bram@vim.org>
Sat, 28 Jul 2018 21:12:05 +0000 (23:12 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 28 Jul 2018 21:12:05 +0000 (23:12 +0200)
Problem:    Hang in bracketed paste mode when t_PE not encountered.
Solution:   Break out of the loop when got_int is set. (suggested by Christian
            Brabandt, closes #3146)

src/edit.c
src/version.c

index 657bd2c864fb7948ab98df017a6ff938f493961a..e1215062396c07769ee7a4c5aa60955c95fbba73 100644 (file)
@@ -9685,22 +9685,31 @@ bracketed_paste(paste_mode_T mode, int drop, garray_T *gap)
     int                ret_char = -1;
     int                save_allow_keys = allow_keys;
     int                save_paste = p_paste;
-    int                save_ai = curbuf->b_p_ai;
 
     /* If the end code is too long we can't detect it, read everything. */
     if (STRLEN(end) >= NUMBUFLEN)
        end = NULL;
     ++no_mapping;
     allow_keys = 0;
-    p_paste = TRUE;
-    curbuf->b_p_ai = FALSE;
+    if (!p_paste)
+       // Also have the side effects of setting 'paste' to make it work much
+       // faster.
+       set_option_value((char_u *)"paste", TRUE, NULL, 0);
 
     for (;;)
     {
-       /* When the end is not defined read everything. */
+       // When the end is not defined read everything there is.
        if (end == NULL && vpeekc() == NUL)
            break;
-       c = plain_vgetc();
+       do
+       {
+           c = vgetc();
+       } while (c == K_IGNORE || c == K_VER_SCROLLBAR || c == K_HOR_SCROLLBAR);
+       if (c == NUL || got_int)
+           // When CTRL-C was encountered the typeahead will be flushed and we
+           // won't get the end sequence.
+           break;
+
 #ifdef FEAT_MBYTE
        if (has_mbyte)
            idx += (*mb_char2bytes)(c, buf + idx);
@@ -9763,8 +9772,8 @@ bracketed_paste(paste_mode_T mode, int drop, garray_T *gap)
 
     --no_mapping;
     allow_keys = save_allow_keys;
-    p_paste = save_paste;
-    curbuf->b_p_ai = save_ai;
+    if (!save_paste)
+       set_option_value((char_u *)"paste", FALSE, NULL, 0);
 
     return ret_char;
 }
index e646a2b43230147abf96d2d0d210f769589fd154..ab58a5c179e0b1f50ed9aba8723fc8c790962def 100644 (file)
@@ -798,6 +798,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    224,
 /**/
     223,
 /**/