mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
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)
This commit is contained in:
parent
5390099a97
commit
cd94277f72
@ -1937,16 +1937,29 @@ do_put(
|
|||||||
--lnum;
|
--lnum;
|
||||||
new_cursor = curwin->w_cursor;
|
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)
|
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)
|
if (VIsual_active)
|
||||||
{
|
{
|
||||||
end_lnum = curbuf->b_visual.vi_end.lnum;
|
end_lnum = curbuf->b_visual.vi_end.lnum;
|
||||||
if (end_lnum < curbuf->b_visual.vi_start.lnum)
|
if (end_lnum < curbuf->b_visual.vi_start.lnum)
|
||||||
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 {
|
do {
|
||||||
@ -1954,6 +1967,16 @@ do_put(
|
|||||||
if (totlen > 0)
|
if (totlen > 0)
|
||||||
{
|
{
|
||||||
oldp = ml_get(lnum);
|
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))
|
if (VIsual_active && col > (int)STRLEN(oldp))
|
||||||
{
|
{
|
||||||
lnum++;
|
lnum++;
|
||||||
|
@ -922,4 +922,13 @@ func Test_visual_inner_block()
|
|||||||
close!
|
close!
|
||||||
endfunc
|
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
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -754,6 +754,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1511,
|
||||||
/**/
|
/**/
|
||||||
1510,
|
1510,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user