summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-22 21:08:44 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-22 21:08:44 +0200
commitcd94277f72e29b740635da84bcd872c96e11bf67 (patch)
tree95deaee0dd9513f3d028a6efb1cb6e32f14faf9d
parent5390099a9733f7952a612670693dd4ebf9e0e178 (diff)
patch 8.2.1511: putting a string in Visual block mode ignores multi-bytev8.2.1511
Problem: Putting a string in Visual block mode ignores multi-byte characters. Solution: Adjust the column for Visual block mode. (closes #6767)
-rw-r--r--src/register.c27
-rw-r--r--src/testdir/test_visual.vim9
-rw-r--r--src/version.c2
3 files changed, 36 insertions, 2 deletions
diff --git a/src/register.c b/src/register.c
index 47fcd73824..61b6b2c25c 100644
--- 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
index f286ba9c42..3243eb03cf 100644
--- 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\<C-V>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
index 60726ab942..6b4fc61732 100644
--- 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,