Patch 8.2.2914

6 views
Skip to first unread message

Bram Moolenaar

unread,
May 30, 2021, 4:18:11 PM5/30/21
to vim...@googlegroups.com

Patch 8.2.2914
Problem: Cannot paste a block without adding padding.
Solution: Add "zp" and "zP" which paste without adding padding. (Christian
Brabandt, closes #8289)
Files: runtime/doc/change.txt, runtime/doc/index.txt, src/normal.c,
src/register.c, src/vim.h, src/testdir/test_normal.vim,
src/testdir/test_visual.vim


*** ../vim-8.2.2913/runtime/doc/change.txt 2021-01-31 17:02:06.246490203 +0100
--- runtime/doc/change.txt 2021-05-30 22:10:25.280442415 +0200
***************
*** 1118,1123 ****
--- 1126,1136 ----
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
***************
*** 1157,1162 ****
--- 1170,1178 ----
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
*** ../vim-8.2.2913/runtime/doc/index.txt 2021-04-24 14:15:03.680264471 +0200
--- runtime/doc/index.txt 2021-05-30 22:05:44.389053296 +0200
***************
*** 864,869 ****
--- 864,871 ----
|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
*** ../vim-8.2.2913/src/normal.c 2021-05-29 19:17:57.716280905 +0200
--- src/normal.c 2021-05-30 22:05:44.389053296 +0200
***************
*** 2973,2978 ****
--- 2973,2982 ----
}
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,7428 ****
}
else
dir = (cap->cmdchar == 'P'
! || (cap->cmdchar == 'g' && cap->nchar == 'P'))
! ? BACKWARD : FORWARD;
prep_redo_cmd(cap);
if (cap->cmdchar == 'g')
flags |= PUT_CURSEND;

if (VIsual_active)
{
--- 7422,7434 ----
}
else
dir = (cap->cmdchar == 'P'
! || ((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)
{
*** ../vim-8.2.2913/src/register.c 2021-03-02 19:04:08.029594922 +0100
--- src/register.c 2021-05-30 22:12:05.324212117 +0200
***************
*** 1497,1502 ****
--- 1497,1503 ----
* "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,1800 ****
bd.textcol = 0;
for (i = 0; i < y_size; ++i)
{
! int spaces;
char shortline;

bd.startspaces = 0;
--- 1795,1801 ----
bd.textcol = 0;
for (i = 0; i < y_size; ++i)
{
! int spaces = 0;
char shortline;

bd.startspaces = 0;
***************
*** 1845,1856 ****

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;

// insert the new text
totlen = count * (yanklen + spaces) + bd.startspaces + bd.endspaces;
--- 1846,1861 ----

yanklen = (int)STRLEN(y_array[i]);

! 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;
*** ../vim-8.2.2913/src/vim.h 2021-05-30 14:02:02.279526678 +0200
--- src/vim.h 2021-05-30 22:05:44.389053296 +0200
***************
*** 1068,1073 ****
--- 1068,1074 ----
#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
*** ../vim-8.2.2913/src/testdir/test_normal.vim 2021-05-29 19:17:57.716280905 +0200
--- src/testdir/test_normal.vim 2021-05-30 22:05:44.389053296 +0200
***************
*** 595,601 ****
" Test for errors with z command
func Test_normal_z_error()
call assert_beeps('normal! z2p')
! call assert_beeps('normal! zp')
endfunc

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

func Test_normal15_z_scroll_vert()
*** ../vim-8.2.2913/src/testdir/test_visual.vim 2021-05-29 16:30:08.674611431 +0200
--- src/testdir/test_visual.vim 2021-05-30 22:05:44.389053296 +0200
***************
*** 1044,1047 ****
--- 1044,1069 ----
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
*** ../vim-8.2.2913/src/version.c 2021-05-30 19:29:37.786489673 +0200
--- src/version.c 2021-05-30 22:06:50.280915822 +0200
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 2914,
/**/

--
Why isn't there mouse-flavored cat food?

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
Reply all
Reply to author
Forward
0 new messages