diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 5abccd7a47..c32935f49e 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -1793,6 +1793,7 @@ void adjust_cursor_eol(void) const bool adj_cursor = (curwin->w_cursor.col > 0 && gchar_cursor() == NUL && (cur_ve_flags & kOptVeFlagOnemore) == 0 + && (cur_ve_flags & kOptVeFlagAll) == 0 && !(restart_edit || (State & MODE_INSERT))); if (!adj_cursor) { return; diff --git a/test/old/testdir/test_virtualedit.vim b/test/old/testdir/test_virtualedit.vim index def96ca64f..7f54d750e9 100644 --- a/test/old/testdir/test_virtualedit.vim +++ b/test/old/testdir/test_virtualedit.vim @@ -732,4 +732,24 @@ func Test_virtualedit_set_cursor_pos_maxcol() bwipe! endfunc +" Verify that getpos() remains consistent when the cursor is past EOL after toggling Visual mode with virtualedit=all. +func Test_virtualedit_getpos_stable_past_eol_after_visual() + new + set virtualedit=all + call setline(1, 'abc') + + normal! gg$3l + let p1 = getpos('.') + + normal! v + redraw + normal! \ + + let p2 = getpos('.') + call assert_equal(p1, p2, 'Position should not be re-encoded after leaving Visual mode') + + set virtualedit& + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab