0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.2914: cannot paste a block without adding padding

Problem:    Cannot paste a block without adding padding.
Solution:   Add "zp" and "zP" which paste without adding padding. (Christian
            Brabandt, closes #8289)
This commit is contained in:
Christian Brabandt
2021-05-30 22:17:25 +02:00
committed by Bram Moolenaar
parent d2ea7cf10a
commit 2fa9384ca1
8 changed files with 56 additions and 10 deletions

View File

@@ -1126,6 +1126,11 @@ inside of strings can change! Also see 'softtabstop' option. >
Using the mouse only works when 'mouse' contains 'n' Using the mouse only works when 'mouse' contains 'n'
or 'a'. 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 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 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 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 each of the selected lines (thus replacing the blockwise selected region by a
block of the pasted line). block of the pasted line).
Use |zP|/|zp| to paste a blockwise yanked register without appending trailing
spaces.
*blockwise-register* *blockwise-register*
If you use a blockwise Visual mode command to get the text into the 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 the block of text will be inserted before ("P") or after ("p") the cursor

View File

@@ -864,6 +864,8 @@ tag char note action in Normal mode ~
|zm| zm subtract one from 'foldlevel' |zm| zm subtract one from 'foldlevel'
|zn| zn reset 'foldenable' |zn| zn reset 'foldenable'
|zo| zo open fold |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' |zr| zr add one to 'foldlevel'
|zs| zs when 'wrap' off scroll horizontally to |zs| zs when 'wrap' off scroll horizontally to
position the cursor at the start (left position the cursor at the start (left

View File

@@ -2973,6 +2973,10 @@ dozet:
} }
break; break;
// "zp", "zP" in block mode put without addind trailing spaces
case 'P':
case 'p': nv_put(cap);
break;
#ifdef FEAT_FOLDING #ifdef FEAT_FOLDING
// "zF": create fold command // "zF": create fold command
// "zf": create fold operator // "zf": create fold operator
@@ -7418,11 +7422,13 @@ nv_put_opt(cmdarg_T *cap, int fix_indent)
} }
else else
dir = (cap->cmdchar == 'P' dir = (cap->cmdchar == 'P'
|| (cap->cmdchar == 'g' && cap->nchar == 'P')) || ((cap->cmdchar == 'g' || cap->cmdchar == 'z')
? BACKWARD : FORWARD; && cap->nchar == 'P')) ? BACKWARD : FORWARD;
prep_redo_cmd(cap); prep_redo_cmd(cap);
if (cap->cmdchar == 'g') if (cap->cmdchar == 'g')
flags |= PUT_CURSEND; flags |= PUT_CURSEND;
else if (cap->cmdchar == 'z')
flags |= PUT_BLOCK_INNER;
if (VIsual_active) if (VIsual_active)
{ {

View File

@@ -1497,6 +1497,7 @@ copy_yank_reg(yankreg_T *reg)
* "flags": PUT_FIXINDENT make indent look nice * "flags": PUT_FIXINDENT make indent look nice
* PUT_CURSEND leave cursor after end of new text * PUT_CURSEND leave cursor after end of new text
* PUT_LINE force linewise put (":put") * PUT_LINE force linewise put (":put")
* PUT_BLOCK_INNER in block mode, do not add trailing spaces
*/ */
void void
do_put( do_put(
@@ -1794,7 +1795,7 @@ do_put(
bd.textcol = 0; bd.textcol = 0;
for (i = 0; i < y_size; ++i) for (i = 0; i < y_size; ++i)
{ {
int spaces; int spaces = 0;
char shortline; char shortline;
bd.startspaces = 0; bd.startspaces = 0;
@@ -1845,12 +1846,16 @@ do_put(
yanklen = (int)STRLEN(y_array[i]); yanklen = (int)STRLEN(y_array[i]);
// calculate number of spaces required to fill right side of block if ((flags & PUT_BLOCK_INNER) == 0)
{
// calculate number of spaces required to fill right side of
// block
spaces = y_width + 1; spaces = y_width + 1;
for (j = 0; j < yanklen; j++) for (j = 0; j < yanklen; j++)
spaces -= lbr_chartabsize(NULL, &y_array[i][j], 0); spaces -= lbr_chartabsize(NULL, &y_array[i][j], 0);
if (spaces < 0) if (spaces < 0)
spaces = 0; spaces = 0;
}
// insert the new text // insert the new text
totlen = count * (yanklen + spaces) + bd.startspaces + bd.endspaces; totlen = count * (yanklen + spaces) + bd.startspaces + bd.endspaces;

View File

@@ -595,7 +595,7 @@ endfunc
" Test for errors with z command " Test for errors with z command
func Test_normal_z_error() func Test_normal_z_error()
call assert_beeps('normal! z2p') call assert_beeps('normal! z2p')
call assert_beeps('normal! zp') call assert_beeps('normal! zq')
endfunc endfunc
func Test_normal15_z_scroll_vert() func Test_normal15_z_scroll_vert()

View File

@@ -1044,4 +1044,26 @@ func Test_visual_put_in_block()
bwipe! bwipe!
endfunc 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 " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2914,
/**/ /**/
2913, 2913,
/**/ /**/

View File

@@ -1068,6 +1068,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
#define PUT_LINE 8 // put register as lines #define PUT_LINE 8 // put register as lines
#define PUT_LINE_SPLIT 16 // split line for linewise register #define PUT_LINE_SPLIT 16 // split line for linewise register
#define PUT_LINE_FORWARD 32 // put linewise register below Visual sel. #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() // flags for set_indent()
#define SIN_CHANGED 1 // call changed_bytes() when line changed #define SIN_CHANGED 1 // call changed_bytes() when line changed