diff options
-rw-r--r-- | runtime/doc/change.txt | 5 | ||||
-rw-r--r-- | src/normal.c | 2 | ||||
-rw-r--r-- | src/ops.c | 51 | ||||
-rw-r--r-- | src/testdir/test20.in | 10 | ||||
-rw-r--r-- | src/testdir/test20.ok | 4 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 55 insertions, 19 deletions
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt index 96a9c8b4a7..77c791ed56 100644 --- a/runtime/doc/change.txt +++ b/runtime/doc/change.txt @@ -1069,6 +1069,11 @@ another register. E.g., yank the text to copy, Visually select the text to 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 index 80ada682ed..4c11a2b607 100644 --- 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); @@ -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 index 7201c75c21..662a1439f2 100644 --- 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 index 2604e7cc8e..7c50ea8db8 100644 --- 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 index fc1880b906..ab6c3c17c0 100644 --- 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, |