# HG changeset patch # User Bram Moolenaar # Date 1379856224 -7200 # Node ID 22dfcd1494e4f7ea8ddc96e8dd895482e77e3b5a # Parent 31cdaf292bbb84f917df966c14bd28718a1d0bd7 updated for version 7.4.034 Problem: Using "p" in Visual block mode only changes the first line. Solution: Repeat the put in all text in the block. (Christian Brabandt) diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt --- a/runtime/doc/change.txt +++ b/runtime/doc/change.txt @@ -1069,6 +1069,11 @@ another register. E.g., yank the text t replace and use "0p . You can repeat this as many times as you like, the unnamed register will be changed each time. +When you use a blockwise Visual mode command and yank only a single line into +a register, a paste on a visual selected area will paste that single line on +each of the selected lines (thus replacing the blockwise selected region by a +block of the pasted line). + *blockwise-register* If you use a blockwise Visual mode command to get the text into the register, the block of text will be inserted before ("P") or after ("p") the cursor diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -9518,6 +9518,8 @@ nv_put(cap) /* cursor is at the end of the line or end of file, put * forward. */ dir = FORWARD; + /* May have been reset in do_put(). */ + VIsual_active = TRUE; } #endif do_put(cap->oap->regname, dir, cap->count1, flags); diff --git a/src/ops.c b/src/ops.c --- a/src/ops.c +++ b/src/ops.c @@ -3776,25 +3776,42 @@ do_put(regname, dir, count, flags) */ if (y_type == MCHAR && y_size == 1) { - totlen = count * yanklen; - if (totlen) - { - oldp = ml_get(lnum); - newp = alloc_check((unsigned)(STRLEN(oldp) + totlen + 1)); - if (newp == NULL) - goto end; /* alloc() will give error message */ - mch_memmove(newp, oldp, (size_t)col); - ptr = newp + col; - for (i = 0; i < count; ++i) + do { + totlen = count * yanklen; + if (totlen > 0) { - mch_memmove(ptr, y_array[0], (size_t)yanklen); - ptr += yanklen; + oldp = ml_get(lnum); + newp = alloc_check((unsigned)(STRLEN(oldp) + totlen + 1)); + if (newp == NULL) + goto end; /* alloc() gave an error message */ + mch_memmove(newp, oldp, (size_t)col); + ptr = newp + col; + for (i = 0; i < count; ++i) + { + mch_memmove(ptr, y_array[0], (size_t)yanklen); + ptr += yanklen; + } + STRMOVE(ptr, oldp + col); + ml_replace(lnum, newp, FALSE); + /* Place cursor on last putted char. */ + if (lnum == curwin->w_cursor.lnum) + curwin->w_cursor.col += (colnr_T)(totlen - 1); } - STRMOVE(ptr, oldp + col); - ml_replace(lnum, newp, FALSE); - /* Put cursor on last putted char. */ - curwin->w_cursor.col += (colnr_T)(totlen - 1); - } +#ifdef FEAT_VISUAL + if (VIsual_active) + lnum++; +#endif + } while ( +#ifdef FEAT_VISUAL + VIsual_active && lnum <= curbuf->b_visual.vi_end.lnum +#else + FALSE /* stop after 1 paste */ +#endif + ); +#ifdef FEAT_VISUAL + VIsual_active = FALSE; +#endif + curbuf->b_op_end = curwin->w_cursor; /* For "CTRL-O p" in Insert mode, put cursor after last char */ if (totlen && (restart_edit != 0 || (flags & PUT_CURSEND))) diff --git a/src/testdir/test20.in b/src/testdir/test20.in --- a/src/testdir/test20.in +++ b/src/testdir/test20.in @@ -9,11 +9,17 @@ G0"ay$k@au @auY:quit! GP /start here$ -jjlld -:/here$/,$-1w! test.out +"by$jjlld +/456$ +jj"bP +:/56$/,$-1w! test.out :qa! ENDTEST +123456 +234567 +345678 + test text test tex start here some text test text diff --git a/src/testdir/test20.ok b/src/testdir/test20.ok --- a/src/testdir/test20.ok +++ b/src/testdir/test20.ok @@ -1,3 +1,7 @@ +123start here56 +234start here67 +345start here78 + test text test tex rt here somext tesext diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -739,6 +739,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 34, +/**/ 33, /**/ 32,