Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
brammool committed Jun 28, 2018
1 parent d8b37a5 commit 630afe8
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 13 deletions.
4 changes: 2 additions & 2 deletions src/macros.h
Expand Up @@ -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
Expand Down
41 changes: 30 additions & 11 deletions src/ops.c
Expand Up @@ -2146,6 +2146,25 @@ mb_adjust_opend(oparg_T *oap)
#endif

#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.
*/
Expand Down Expand Up @@ -2331,12 +2350,7 @@ op_replace(oparg_T *oap, int c)
* with a multi-byte and the other way around. */
if (curwin->w_cursor.lnum == oap->end.lnum)
oap->end.col += (*mb_char2len)(c) - (*mb_char2len)(n);
n = State;
State = REPLACE;
ins_char(c);
State = n;
/* Backup to the replaced character. */
dec_cursor();
replace_character(c);
}
else
#endif
Expand All @@ -2358,7 +2372,7 @@ op_replace(oparg_T *oap, int c)
getvpos(&oap->end, end_vcol);
}
#endif
PCHAR(curwin->w_cursor, c);
PBYTE(curwin->w_cursor, c);
}
}
#ifdef FEAT_VIRTUALEDIT
Expand All @@ -2377,9 +2391,14 @@ op_replace(oparg_T *oap, int c)
curwin->w_cursor.col -= (virtcols + 1);
for (; virtcols >= 0; virtcols--)
{
PCHAR(curwin->w_cursor, c);
if (inc(&curwin->w_cursor) == -1)
break;
#ifdef FEAT_MBYTE
if ((*mb_char2len)(c) > 1)
replace_character(c);
else
#endif
PBYTE(curwin->w_cursor, c);
if (inc(&curwin->w_cursor) == -1)
break;
}
}
#endif
Expand Down Expand Up @@ -2619,7 +2638,7 @@ swapchar(int op_type, pos_T *pos)
}
else
#endif
PCHAR(*pos, nc);
PBYTE(*pos, nc);
return TRUE;
}
return FALSE;
Expand Down
16 changes: 16 additions & 0 deletions src/testdir/test_virtualedit.vim
Expand Up @@ -42,6 +42,22 @@ func Test_paste_end_of_line()
set virtualedit=
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()
new
set virtualedit=insert
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -789,6 +789,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
125,
/**/
124,
/**/
Expand Down

0 comments on commit 630afe8

Please sign in to comment.