diff --git a/src/Makefile b/src/Makefile index ac156d1923..bb1f784f61 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2164,6 +2164,7 @@ test_arglist \ test_options \ test_packadd \ test_partial \ + test_paste \ test_perl \ test_popup \ test_profile \ @@ -2178,9 +2179,9 @@ test_arglist \ test_searchpos \ test_set \ test_signs \ + test_smartindent \ test_sort \ test_source_utf8 \ - test_smartindent \ test_startup \ test_startup_utf8 \ test_stat \ diff --git a/src/buffer.c b/src/buffer.c index 24a59e7a28..ad265639f4 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2157,6 +2157,7 @@ free_buf_options( #if defined(FEAT_CRYPT) clear_string_option(&buf->b_p_cm); #endif + clear_string_option(&buf->b_p_fp); #if defined(FEAT_EVAL) clear_string_option(&buf->b_p_fex); #endif diff --git a/src/edit.c b/src/edit.c index 9d86bbc702..4197b3029e 100644 --- a/src/edit.c +++ b/src/edit.c @@ -463,7 +463,10 @@ edit( else #endif { - AppendCharToRedobuff(cmdchar); + if (cmdchar == K_PS) + AppendCharToRedobuff('a'); + else + AppendCharToRedobuff(cmdchar); if (cmdchar == 'g') /* "gI" command */ AppendCharToRedobuff('I'); else if (cmdchar == 'r') /* "r" command */ @@ -531,6 +534,10 @@ edit( revins_legal = 0; revins_scol = -1; #endif + if (!p_ek) + /* Disable bracketed paste mode, we won't recognize the escape + * sequences. */ + out_str(T_BD); /* * Handle restarting Insert mode. @@ -8634,6 +8641,9 @@ ins_esc( #ifdef CURSOR_SHAPE ui_cursor_shape(); /* may show different cursor shape */ #endif + if (!p_ek) + /* Re-enable bracketed paste mode. */ + out_str(T_BE); /* * When recording or for CTRL-O, need to display the new mode. @@ -9531,8 +9541,14 @@ bracketed_paste(paste_mode_T mode, int drop, garray_T *gap) case PASTE_INSERT: if (stop_arrow() == OK) { - ins_char_bytes(buf, idx); - AppendToRedobuffLit(buf, idx); + c = buf[0]; + if (idx == 1 && (c == CAR || c == K_KENTER || c == NL)) + ins_eol(c); + else + { + ins_char_bytes(buf, idx); + AppendToRedobuffLit(buf, idx); + } } break; diff --git a/src/ex_getln.c b/src/ex_getln.c index 97ce29c028..d426df963a 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -4377,7 +4377,9 @@ addstar( || context == EXPAND_OWNSYNTAX || context == EXPAND_FILETYPE || context == EXPAND_PACKADD - || (context == EXPAND_TAGS && fname[0] == '/')) + || ((context == EXPAND_TAGS_LISTFILES + || context == EXPAND_TAGS) + && fname[0] == '/')) retval = vim_strnsave(fname, len); else { diff --git a/src/ops.c b/src/ops.c index 1abb8daa1f..7d656a6313 100644 --- a/src/ops.c +++ b/src/ops.c @@ -3774,16 +3774,25 @@ do_put( */ if (y_type == MCHAR && y_size == 1) { - linenr_T end = curbuf->b_visual.vi_end.lnum; + linenr_T end_lnum = 0; /* init for gcc */ - if (curbuf->b_visual.vi_end.lnum < curbuf->b_visual.vi_start.lnum) - end = curbuf->b_visual.vi_start.lnum; + if (VIsual_active) + { + end_lnum = curbuf->b_visual.vi_end.lnum; + if (end_lnum < curbuf->b_visual.vi_start.lnum) + end_lnum = curbuf->b_visual.vi_start.lnum; + } do { totlen = count * yanklen; if (totlen > 0) { oldp = ml_get(lnum); + if (VIsual_active && col > (int)STRLEN(oldp)) + { + lnum++; + continue; + } newp = alloc_check((unsigned)(STRLEN(oldp) + totlen + 1)); if (newp == NULL) goto end; /* alloc() gave an error message */ @@ -3806,7 +3815,7 @@ do_put( } if (VIsual_active) lnum++; - } while (VIsual_active && lnum <= end); + } while (VIsual_active && lnum <= end_lnum); if (VIsual_active) /* reset lnum to the last visual line */ lnum--; diff --git a/src/screen.c b/src/screen.c index 8a3983e57e..d65be2d496 100644 --- a/src/screen.c +++ b/src/screen.c @@ -3651,6 +3651,7 @@ win_line( { /* Draw the 'foldcolumn'. Allocate a buffer, "extra" may * already be in use. */ + vim_free(p_extra_free); p_extra_free = alloc(12 + 1); if (p_extra_free != NULL) @@ -4695,6 +4696,7 @@ win_line( p = alloc((unsigned)(len + 1)); vim_memset(p, ' ', len); p[len] = NUL; + vim_free(p_extra_free); p_extra_free = p; for (i = 0; i < tab_len; i++) { @@ -4857,6 +4859,7 @@ win_line( vim_memset(p, ' ', n_extra); STRNCPY(p, p_extra + 1, STRLEN(p_extra) - 1); p[n_extra] = NUL; + vim_free(p_extra_free); p_extra_free = p_extra = p; } else @@ -5789,6 +5792,7 @@ win_line( } #endif + vim_free(p_extra_free); return row; } diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak index e0da1b408d..613b86804e 100644 --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -173,6 +173,7 @@ NEW_TESTS = test_arglist.res \ test_nested_function.res \ test_netbeans.res \ test_normal.res \ + test_paste.res \ test_packadd.res \ test_perl.res \ test_profile.res \ diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index 279a1681c4..fcfce7354d 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -295,3 +295,14 @@ func Test_illegal_address() 2;') quit endfunc + +func Test_cmdline_complete_wildoptions() + help + call feedkeys(":tag /\\\"\", 'tx') + let a = join(sort(split(@:)),' ') + set wildoptions=tagfile + call feedkeys(":tag /\\\"\", 'tx') + let b = join(sort(split(@:)),' ') + call assert_equal(a, b) + bw! +endfunc diff --git a/src/testdir/test_paste.vim b/src/testdir/test_paste.vim new file mode 100644 index 0000000000..dfe6bdc875 --- /dev/null +++ b/src/testdir/test_paste.vim @@ -0,0 +1,44 @@ +" Tests for bracketed paste. + +" Bracketed paste only works with "xterm". Not in GUI. +if has('gui_running') + finish +endif +set term=xterm + +func Test_paste_normal_mode() + new + call setline(1, ['a', 'b', 'c']) + 2 + call feedkeys("\[200~foo\bar\[201~", 'xt') + call assert_equal('bfoo', getline(2)) + call assert_equal('bar', getline(3)) + call assert_equal('c', getline(4)) + + normal . + call assert_equal('barfoo', getline(3)) + call assert_equal('bar', getline(4)) + call assert_equal('c', getline(5)) + bwipe! +endfunc + +func Test_paste_insert_mode() + new + call setline(1, ['a', 'b', 'c']) + 2 + call feedkeys("i\[200~foo\bar\[201~ done\", 'xt') + call assert_equal('foo', getline(2)) + call assert_equal('bar doneb', getline(3)) + call assert_equal('c', getline(4)) + + normal . + call assert_equal('bar donfoo', getline(3)) + call assert_equal('bar doneeb', getline(4)) + call assert_equal('c', getline(5)) + bwipe! +endfunc + +func Test_paste_cmdline() + call feedkeys(":a\[200~foo\bar\[201~b\\"\", 'xt') + call assert_equal("\"afoo\barb", getreg(':')) +endfunc diff --git a/src/testdir/test_put.vim b/src/testdir/test_put.vim index 0154de1ec0..38c812bc9c 100644 --- a/src/testdir/test_put.vim +++ b/src/testdir/test_put.vim @@ -21,3 +21,16 @@ func Test_put_char_block() call assert_equal(['Xfile_put 1', 'Xfile_put 2'], getline(1,2)) bw! endfunc + +func Test_put_char_block2() + new + let a = [ getreg('a'), getregtype('a') ] + call setreg('a', ' one ', 'v') + call setline(1, ['Line 1', '', 'Line 3', '']) + " visually select the first 3 lines and put register a over it + exe "norm! ggl\2j2l\"ap" + call assert_equal(['L one 1', '', 'L one 3', ''], getline(1,4)) + " clean up + bw! + call setreg('a', a[0], a[1]) +endfunc diff --git a/src/version.c b/src/version.c index 52fe9be20f..774169fbf9 100644 --- a/src/version.c +++ b/src/version.c @@ -779,6 +779,24 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 237, +/**/ + 236, +/**/ + 235, +/**/ + 234, +/**/ + 233, +/**/ + 232, +/**/ + 231, +/**/ + 230, +/**/ + 229, /**/ 228, /**/