mirror of
https://github.com/vim/vim.git
synced 2025-07-25 10:54:51 -04:00
patch 8.1.0125: virtual edit replace with multi-byte fails at end of line
Problem: Virtual edit replace with multi-byte fails at end of line. (Lukas Werling) Solution: use ins_char() to add the character. (Christian Brabandt, closes #3114) Rename PCHAR() to PBYTE() to avoid mistakes like this.
This commit is contained in:
parent
d8b37a53bd
commit
630afe889a
@ -14,9 +14,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PCHAR(lp, c) - put character 'c' at position 'lp'
|
* PBYTE(lp, c) - put byte 'c' at position 'lp'
|
||||||
*/
|
*/
|
||||||
#define PCHAR(lp, c) (*(ml_get_buf(curbuf, (lp).lnum, TRUE) + (lp).col) = (c))
|
#define PBYTE(lp, c) (*(ml_get_buf(curbuf, (lp).lnum, TRUE) + (lp).col) = (c))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Position comparisons
|
* Position comparisons
|
||||||
|
41
src/ops.c
41
src/ops.c
@ -2146,6 +2146,25 @@ mb_adjust_opend(oparg_T *oap)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(FEAT_VISUALEXTRA) || defined(PROTO)
|
#if defined(FEAT_VISUALEXTRA) || defined(PROTO)
|
||||||
|
|
||||||
|
# ifdef FEAT_MBYTE
|
||||||
|
/*
|
||||||
|
* Replace the character under the cursor with "c".
|
||||||
|
* This takes care of multi-byte characters.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
replace_character(int c)
|
||||||
|
{
|
||||||
|
int n = State;
|
||||||
|
|
||||||
|
State = REPLACE;
|
||||||
|
ins_char(c);
|
||||||
|
State = n;
|
||||||
|
/* Backup to the replaced character. */
|
||||||
|
dec_cursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif
|
||||||
/*
|
/*
|
||||||
* Replace a whole area with one character.
|
* Replace a whole area with one character.
|
||||||
*/
|
*/
|
||||||
@ -2331,12 +2350,7 @@ op_replace(oparg_T *oap, int c)
|
|||||||
* with a multi-byte and the other way around. */
|
* with a multi-byte and the other way around. */
|
||||||
if (curwin->w_cursor.lnum == oap->end.lnum)
|
if (curwin->w_cursor.lnum == oap->end.lnum)
|
||||||
oap->end.col += (*mb_char2len)(c) - (*mb_char2len)(n);
|
oap->end.col += (*mb_char2len)(c) - (*mb_char2len)(n);
|
||||||
n = State;
|
replace_character(c);
|
||||||
State = REPLACE;
|
|
||||||
ins_char(c);
|
|
||||||
State = n;
|
|
||||||
/* Backup to the replaced character. */
|
|
||||||
dec_cursor();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -2358,7 +2372,7 @@ op_replace(oparg_T *oap, int c)
|
|||||||
getvpos(&oap->end, end_vcol);
|
getvpos(&oap->end, end_vcol);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
PCHAR(curwin->w_cursor, c);
|
PBYTE(curwin->w_cursor, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef FEAT_VIRTUALEDIT
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
@ -2377,9 +2391,14 @@ op_replace(oparg_T *oap, int c)
|
|||||||
curwin->w_cursor.col -= (virtcols + 1);
|
curwin->w_cursor.col -= (virtcols + 1);
|
||||||
for (; virtcols >= 0; virtcols--)
|
for (; virtcols >= 0; virtcols--)
|
||||||
{
|
{
|
||||||
PCHAR(curwin->w_cursor, c);
|
#ifdef FEAT_MBYTE
|
||||||
if (inc(&curwin->w_cursor) == -1)
|
if ((*mb_char2len)(c) > 1)
|
||||||
break;
|
replace_character(c);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
PBYTE(curwin->w_cursor, c);
|
||||||
|
if (inc(&curwin->w_cursor) == -1)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -2619,7 +2638,7 @@ swapchar(int op_type, pos_T *pos)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
PCHAR(*pos, nc);
|
PBYTE(*pos, nc);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -42,6 +42,22 @@ func Test_paste_end_of_line()
|
|||||||
set virtualedit=
|
set virtualedit=
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_replace_end_of_line()
|
||||||
|
new
|
||||||
|
set virtualedit=all
|
||||||
|
call setline(1, range(20))
|
||||||
|
exe "normal! gg2jv10lr-"
|
||||||
|
call assert_equal(["1", "-----------", "3"], getline(2,4))
|
||||||
|
if has('multi_byte')
|
||||||
|
call setline(1, range(20))
|
||||||
|
exe "normal! gg2jv10lr\<c-k>hh"
|
||||||
|
call assert_equal(["1", "───────────", "3"], getline(2,4))
|
||||||
|
endif
|
||||||
|
|
||||||
|
bwipe!
|
||||||
|
set virtualedit=
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_edit_CTRL_G()
|
func Test_edit_CTRL_G()
|
||||||
new
|
new
|
||||||
set virtualedit=insert
|
set virtualedit=insert
|
||||||
|
@ -789,6 +789,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 */
|
||||||
|
/**/
|
||||||
|
125,
|
||||||
/**/
|
/**/
|
||||||
124,
|
124,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user