# HG changeset patch # User Bram Moolenaar # Date 1598123703 -7200 # Node ID 2626306efe448a6fb3b652c66478351c395ff9d8 # Parent bad21603b8c48f6daabde680756cfd960a97fde6 patch 8.2.1511: putting a string in Visual block mode ignores multi-byte Commit: https://github.com/vim/vim/commit/cd94277f72e29b740635da84bcd872c96e11bf67 Author: Bram Moolenaar Date: Sat Aug 22 21:08:44 2020 +0200 patch 8.2.1511: putting a string in Visual block mode ignores multi-byte Problem: Putting a string in Visual block mode ignores multi-byte characters. Solution: Adjust the column for Visual block mode. (closes #6767) diff --git a/src/register.c b/src/register.c --- a/src/register.c +++ b/src/register.c @@ -1937,16 +1937,29 @@ do_put( --lnum; new_cursor = curwin->w_cursor; - // simple case: insert into current line + // simple case: insert into one line at a time if (y_type == MCHAR && y_size == 1) { - linenr_T end_lnum = 0; // init for gcc + linenr_T end_lnum = 0; // init for gcc + linenr_T start_lnum = lnum; if (VIsual_active) { end_lnum = curbuf->b_visual.vi_end.lnum; if (end_lnum < curbuf->b_visual.vi_start.lnum) end_lnum = curbuf->b_visual.vi_start.lnum; + if (end_lnum > start_lnum) + { + pos_T pos; + + // "col" is valid for the first line, in following lines + // the virtual column needs to be used. Matters for + // multi-byte characters. + pos.lnum = lnum; + pos.col = col; + pos.coladd = 0; + getvcol(curwin, &pos, NULL, &vcol, NULL); + } } do { @@ -1954,6 +1967,16 @@ do_put( if (totlen > 0) { oldp = ml_get(lnum); + if (lnum > start_lnum) + { + pos_T pos; + + pos.lnum = lnum; + if (getvpos(&pos, vcol) == OK) + col = pos.col; + else + col = MAXCOL; + } if (VIsual_active && col > (int)STRLEN(oldp)) { lnum++; diff --git a/src/testdir/test_visual.vim b/src/testdir/test_visual.vim --- a/src/testdir/test_visual.vim +++ b/src/testdir/test_visual.vim @@ -922,4 +922,13 @@ func Test_visual_inner_block() close! endfunc +func Test_visual_put_in_block() + new + call setline(1, ['xxxx', 'y∞yy', 'zzzz']) + normal 1G2yl + exe "normal 1G2l\jjlp" + call assert_equal(['xxxx', 'y∞xx', 'zzxx'], getline(1, 3)) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1511, +/**/ 1510, /**/ 1509,