Mercurial > vim
changeset 5365:22dfcd1494e4 v7.4.034
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)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Sun, 22 Sep 2013 15:23:44 +0200 |
parents | 31cdaf292bbb |
children | e13fe8b20382 |
files | runtime/doc/change.txt src/normal.c src/ops.c src/testdir/test20.in src/testdir/test20.ok src/version.c |
diffstat | 6 files changed, 55 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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);
--- 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)))
--- 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