mirror of
https://github.com/neovim/neovim.git
synced 2025-09-27 21:48:35 +00:00
Merge pull request #17095 from zeertzjq/vim-8.2.3227
vim-patch:8.2.{3227,3280,4094}: global-local 'virtualedit'
This commit is contained in:
@@ -2196,19 +2196,22 @@ void 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 window. To override that state, we need to
|
||||
// set the window-local value of ve_flags rather than the global value.
|
||||
if (curwin->w_cursor.coladd > 0) {
|
||||
unsigned old_ve_flags = ve_flags;
|
||||
unsigned old_ve_flags = curwin->w_ve_flags;
|
||||
|
||||
ve_flags = VE_ALL;
|
||||
if (u_save_cursor() == FAIL) {
|
||||
return;
|
||||
}
|
||||
curwin->w_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;
|
||||
curwin->w_ve_flags = old_ve_flags;
|
||||
}
|
||||
// Get the info about the block before entering the text
|
||||
block_prep(oap, &bd, oap->start.lnum, true);
|
||||
@@ -2906,6 +2909,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
|
||||
char_u *insert_string = NULL;
|
||||
bool allocated = false;
|
||||
long cnt;
|
||||
unsigned int cur_ve_flags = get_ve_flags();
|
||||
|
||||
if (flags & PUT_FIXINDENT) {
|
||||
orig_indent = get_indent();
|
||||
@@ -2976,7 +2980,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
|
||||
eol = (*(cursor_pos + utfc_ptr2len(cursor_pos)) == NUL);
|
||||
}
|
||||
|
||||
bool ve_allows = (ve_flags == VE_ALL || ve_flags == VE_ONEMORE);
|
||||
bool ve_allows = (cur_ve_flags == VE_ALL || cur_ve_flags == VE_ONEMORE);
|
||||
bool eof = curbuf->b_ml.ml_line_count == curwin->w_cursor.lnum
|
||||
&& one_past_line;
|
||||
if (ve_allows || !(eol || eof)) {
|
||||
@@ -3152,7 +3156,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
|
||||
|
||||
yanklen = (int)STRLEN(y_array[0]);
|
||||
|
||||
if (ve_flags == VE_ALL && y_type == kMTCharWise) {
|
||||
if (cur_ve_flags == VE_ALL && y_type == kMTCharWise) {
|
||||
if (gchar_cursor() == TAB) {
|
||||
int viscol = getviscol();
|
||||
long ts = curbuf->b_p_ts;
|
||||
@@ -3181,7 +3185,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
|
||||
colnr_T endcol2 = 0;
|
||||
|
||||
if (dir == FORWARD && c != NUL) {
|
||||
if (ve_flags == VE_ALL) {
|
||||
if (cur_ve_flags == VE_ALL) {
|
||||
getvcol(curwin, &curwin->w_cursor, &col, NULL, &endcol2);
|
||||
} else {
|
||||
getvcol(curwin, &curwin->w_cursor, NULL, NULL, &col);
|
||||
@@ -3195,9 +3199,8 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
|
||||
}
|
||||
|
||||
col += curwin->w_cursor.coladd;
|
||||
if (ve_flags == VE_ALL
|
||||
&& (curwin->w_cursor.coladd > 0
|
||||
|| endcol2 == curwin->w_cursor.col)) {
|
||||
if (cur_ve_flags == VE_ALL
|
||||
&& (curwin->w_cursor.coladd > 0 || endcol2 == curwin->w_cursor.col)) {
|
||||
if (dir == FORWARD && c == NUL) {
|
||||
col++;
|
||||
}
|
||||
@@ -3629,14 +3632,16 @@ end:
|
||||
*/
|
||||
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;
|
||||
|
||||
// Coladd is set to the width of the last character.
|
||||
|
Reference in New Issue
Block a user