diff options
-rw-r--r-- | runtime/doc/change.txt | 8 | ||||
-rw-r--r-- | runtime/doc/index.txt | 2 | ||||
-rw-r--r-- | src/normal.c | 10 | ||||
-rw-r--r-- | src/register.c | 19 | ||||
-rw-r--r-- | src/testdir/test_normal.vim | 2 | ||||
-rw-r--r-- | src/testdir/test_visual.vim | 22 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 1 |
8 files changed, 56 insertions, 10 deletions
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt index d0b50ca9a5..6040926f62 100644 --- a/runtime/doc/change.txt +++ b/runtime/doc/change.txt @@ -1126,6 +1126,11 @@ inside of strings can change! Also see 'softtabstop' option. > Using the mouse only works when 'mouse' contains 'n' or 'a'. +["x]zp or *zp* *zP* +["x]zP Like "p" and "P", except without adding trailing spaces + when pasting a block. Thus the inserted text will not + always be a rectangle. + You can use these commands to copy text from one place to another. Do this by first getting the text into a register with a yank, delete or change command, then inserting the register contents with a put command. You can @@ -1165,6 +1170,9 @@ 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). +Use |zP|/|zp| to paste a blockwise yanked register without appending trailing +spaces. + *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/runtime/doc/index.txt b/runtime/doc/index.txt index 545adff01a..118bc22179 100644 --- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -864,6 +864,8 @@ tag char note action in Normal mode ~ |zm| zm subtract one from 'foldlevel' |zn| zn reset 'foldenable' |zo| zo open fold +|zp| zp paste in block-mode without trailing spaces +|zP| zP paste in block-mode without trailing spaces |zr| zr add one to 'foldlevel' |zs| zs when 'wrap' off scroll horizontally to position the cursor at the start (left diff --git a/src/normal.c b/src/normal.c index a7b32c6499..39643bae88 100644 --- a/src/normal.c +++ b/src/normal.c @@ -2973,6 +2973,10 @@ dozet: } break; + // "zp", "zP" in block mode put without addind trailing spaces + case 'P': + case 'p': nv_put(cap); + break; #ifdef FEAT_FOLDING // "zF": create fold command // "zf": create fold operator @@ -7418,11 +7422,13 @@ nv_put_opt(cmdarg_T *cap, int fix_indent) } else dir = (cap->cmdchar == 'P' - || (cap->cmdchar == 'g' && cap->nchar == 'P')) - ? BACKWARD : FORWARD; + || ((cap->cmdchar == 'g' || cap->cmdchar == 'z') + && cap->nchar == 'P')) ? BACKWARD : FORWARD; prep_redo_cmd(cap); if (cap->cmdchar == 'g') flags |= PUT_CURSEND; + else if (cap->cmdchar == 'z') + flags |= PUT_BLOCK_INNER; if (VIsual_active) { diff --git a/src/register.c b/src/register.c index 6ba4e896d8..f4d934393b 100644 --- a/src/register.c +++ b/src/register.c @@ -1497,6 +1497,7 @@ copy_yank_reg(yankreg_T *reg) * "flags": PUT_FIXINDENT make indent look nice * PUT_CURSEND leave cursor after end of new text * PUT_LINE force linewise put (":put") + * PUT_BLOCK_INNER in block mode, do not add trailing spaces */ void do_put( @@ -1794,7 +1795,7 @@ do_put( bd.textcol = 0; for (i = 0; i < y_size; ++i) { - int spaces; + int spaces = 0; char shortline; bd.startspaces = 0; @@ -1845,12 +1846,16 @@ do_put( yanklen = (int)STRLEN(y_array[i]); - // calculate number of spaces required to fill right side of block - spaces = y_width + 1; - for (j = 0; j < yanklen; j++) - spaces -= lbr_chartabsize(NULL, &y_array[i][j], 0); - if (spaces < 0) - spaces = 0; + if ((flags & PUT_BLOCK_INNER) == 0) + { + // calculate number of spaces required to fill right side of + // block + spaces = y_width + 1; + for (j = 0; j < yanklen; j++) + spaces -= lbr_chartabsize(NULL, &y_array[i][j], 0); + if (spaces < 0) + spaces = 0; + } // insert the new text totlen = count * (yanklen + spaces) + bd.startspaces + bd.endspaces; diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index f6e60a8ae5..48cc46e074 100644 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -595,7 +595,7 @@ endfunc " Test for errors with z command func Test_normal_z_error() call assert_beeps('normal! z2p') - call assert_beeps('normal! zp') + call assert_beeps('normal! zq') endfunc func Test_normal15_z_scroll_vert() diff --git a/src/testdir/test_visual.vim b/src/testdir/test_visual.vim index cd039c09fc..2b3b2139ee 100644 --- a/src/testdir/test_visual.vim +++ b/src/testdir/test_visual.vim @@ -1044,4 +1044,26 @@ func Test_visual_put_in_block() bwipe! endfunc +func Test_visual_put_in_block_using_zp() + new + " paste using zP + call setline(1, ['/path;text', '/path;text', '/path;text', '', + \ '/subdir', + \ '/longsubdir', + \ '/longlongsubdir']) + exe "normal! 5G\<c-v>2j$y" + norm! 1Gf;zP + call assert_equal(['/path/subdir;text', '/path/longsubdir;text', '/path/longlongsubdir;text'], getline(1, 3)) + %d + " paste using zP + call setline(1, ['/path;text', '/path;text', '/path;text', '', + \ '/subdir', + \ '/longsubdir', + \ '/longlongsubdir']) + exe "normal! 5G\<c-v>2j$y" + norm! 1Gf;hzp + call assert_equal(['/path/subdir;text', '/path/longsubdir;text', '/path/longlongsubdir;text'], getline(1, 3)) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 94e94c4767..56ce534053 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2914, +/**/ 2913, /**/ 2912, @@ -1068,6 +1068,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring); #define PUT_LINE 8 // put register as lines #define PUT_LINE_SPLIT 16 // split line for linewise register #define PUT_LINE_FORWARD 32 // put linewise register below Visual sel. +#define PUT_BLOCK_INNER 64 // in block mode, do not add trailing spaces // flags for set_indent() #define SIN_CHANGED 1 // call changed_bytes() when line changed |