Mercurial > vim
diff src/edit.c @ 14419:cdc4eacdd81d v8.1.0224
patch 8.1.0224: hang in bracketed paste mode when t_PE not encountered
commit https://github.com/vim/vim/commit/fdd7155fab3447b38280035c66178330f8f041e7
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jul 28 23:12:05 2018 +0200
patch 8.1.0224: hang in bracketed paste mode when t_PE not encountered
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 28 Jul 2018 23:15:05 +0200 |
parents | 3c80092eb211 |
children | 0a69e6e708f9 |
line wrap: on
line diff
--- a/src/edit.c +++ b/src/edit.c @@ -9685,22 +9685,31 @@ bracketed_paste(paste_mode_T mode, int d 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 d --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; }