0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.3227: 'virtualedit' can only be set globally

Problem:    'virtualedit' can only be set globally.
Solution:   Make 'virtualedit' global-local. (Gary Johnson, closes #8638)
This commit is contained in:
Gary Johnson
2021-07-26 22:19:10 +02:00
committed by Bram Moolenaar
parent 29b857150c
commit 53ba05b090
17 changed files with 220 additions and 41 deletions

View File

@@ -1474,18 +1474,22 @@ op_insert(oparg_T *oap, long count1)
// doing block_prep(). When only "block" is used, virtual edit is
// already disabled, but still need it when calling
// coladvance_force().
// coladvance_force() uses get_ve_flags() to get the 'virtualedit'
// state for the current buffer. To override that state, we need to
// set the buffer-local value of ve_flags rather than the global value.
if (curwin->w_cursor.coladd > 0)
{
int old_ve_flags = ve_flags;
int old_ve_flags = curbuf->b_ve_flags;
ve_flags = VE_ALL;
if (u_save_cursor() == FAIL)
return;
curbuf->b_ve_flags = VE_ALL;
coladvance_force(oap->op_type == OP_APPEND
? oap->end_vcol + 1 : getviscol());
if (oap->op_type == OP_APPEND)
--curwin->w_cursor.col;
ve_flags = old_ve_flags;
curbuf->b_ve_flags = old_ve_flags;
}
// Get the info about the block before entering the text
block_prep(oap, &bd, oap->start.lnum, TRUE);
@@ -1816,15 +1820,17 @@ op_change(oparg_T *oap)
void
adjust_cursor_eol(void)
{
unsigned int cur_ve_flags = get_ve_flags();
if (curwin->w_cursor.col > 0
&& gchar_cursor() == NUL
&& (ve_flags & VE_ONEMORE) == 0
&& (cur_ve_flags & VE_ONEMORE) == 0
&& !(restart_edit || (State & INSERT)))
{
// Put the cursor on the last character in the line.
dec_cursor();
if (ve_flags == VE_ALL)
if (cur_ve_flags == VE_ALL)
{
colnr_T scol, ecol;