diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2020-08-22 17:00:13 -0400 |
---|---|---|
committer | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2020-08-22 17:07:21 -0400 |
commit | 246c510b6022b7155c9b78767c41094df7cb2be8 (patch) | |
tree | e75e6d0435ce10e9df427c5b11e943127dad0983 | |
parent | 091fc72a92a2a6401af5540c96e862f86189c12d (diff) | |
download | rneovim-246c510b6022b7155c9b78767c41094df7cb2be8.tar.gz rneovim-246c510b6022b7155c9b78767c41094df7cb2be8.tar.bz2 rneovim-246c510b6022b7155c9b78767c41094df7cb2be8.zip |
vim-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 vim/vim#6767)
https://github.com/vim/vim/commit/cd94277f72e29b740635da84bcd872c96e11bf67
-rw-r--r-- | src/nvim/ops.c | 24 | ||||
-rw-r--r-- | src/nvim/testdir/test_visual.vim | 11 |
2 files changed, 34 insertions, 1 deletions
diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 595a699563..d31328219f 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -3238,21 +3238,43 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags) --lnum; new_cursor = curwin->w_cursor; - // simple case: insert into current line + // simple case: insert into one line at a time if (y_type == kMTCharWise && y_size == 1) { 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) { + // "col" is valid for the first line, in following lines + // the virtual column needs to be used. Matters for + // multi-byte characters. + pos_T pos = { + .lnum = lnum, + .col = col, + .coladd = 0, + }; + getvcol(curwin, &pos, NULL, &vcol, NULL); + } } do { totlen = (size_t)(count * yanklen); if (totlen > 0) { oldp = ml_get(lnum); + if (lnum > start_lnum) { + pos_T pos = { + .lnum = lnum, + }; + if (getvpos(&pos, vcol) == OK) { + col = pos.col; + } else { + col = MAXCOL; + } + } if (VIsual_active && col > (int)STRLEN(oldp)) { lnum++; continue; diff --git a/src/nvim/testdir/test_visual.vim b/src/nvim/testdir/test_visual.vim index 7fc8cdd7f4..734f264672 100644 --- a/src/nvim/testdir/test_visual.vim +++ b/src/nvim/testdir/test_visual.vim @@ -432,3 +432,14 @@ func Test_Visual_Block() close! endfunc + +func Test_visual_put_in_block() + new + call setline(1, ['xxxx', 'y∞yy', 'zzzz']) + normal 1G2yl + exe "normal 1G2l\<C-V>jjlp" + call assert_equal(['xxxx', 'y∞xx', 'zzxx'], getline(1, 3)) + bwipe! +endfunc + +" vim: shiftwidth=2 sts=2 expandtab |