To: vim_dev@googlegroups.com Subject: Patch 8.2.2914 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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\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\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 -- Bram@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 ///