diff options
-rw-r--r-- | src/nvim/buffer.c | 12 | ||||
-rw-r--r-- | src/nvim/normal.c | 3 | ||||
-rw-r--r-- | src/nvim/testdir/test_normal.vim | 14 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
4 files changed, 29 insertions, 2 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index f52989c74d..0a95cc9020 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -438,6 +438,13 @@ void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last) /* Remember if we are closing the current buffer. Restore the number of * windows, so that autocommands in buf_freeall() don't get confused. */ bool is_curbuf = (buf == curbuf); + + // When closing the current buffer stop Visual mode before freeing + // anything. + if (is_curbuf) { + end_visual_mode(); + } + buf->b_nwindows = nwindows; buf_freeall(buf, (del_buf ? BFA_DEL : 0) + (wipe_buf ? BFA_WIPE : 0)); @@ -1075,6 +1082,11 @@ do_buffer ( } } + // When closing the current buffer stop Visual mode. + if (buf == curbuf) { + end_visual_mode(); + } + /* * If deleting the last (listed) buffer, make it empty. * The last (listed) buffer cannot be unloaded. diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 1fd03257ec..ce286042df 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -1596,6 +1596,8 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank) oap->start = curwin->w_cursor; } + // Just in case lines were deleted that make the position invalid. + check_pos(curwin->w_buffer, &oap->end); oap->line_count = oap->end.lnum - oap->start.lnum + 1; /* Set "virtual_op" before resetting VIsual_active. */ @@ -7831,7 +7833,6 @@ static void get_op_vcol( // prevent from moving onto a trail byte if (has_mbyte) { - check_pos(curwin->w_buffer, &oap->end); mb_adjustpos(curwin->w_buffer, &oap->end); } diff --git a/src/nvim/testdir/test_normal.vim b/src/nvim/testdir/test_normal.vim index b894a633c4..79af7b2587 100644 --- a/src/nvim/testdir/test_normal.vim +++ b/src/nvim/testdir/test_normal.vim @@ -1998,3 +1998,17 @@ func! Test_normal46_ignore() " clean up bw! endfu + +func! Test_normal47_visual_buf_wipe() + " This was causing a crash or ml_get error. + enew! + call setline(1,'xxx') + normal $ + new + call setline(1, range(1,2)) + 2 + exe "norm \<C-V>$" + bw! + norm yp + set nomodified +endfu diff --git a/src/nvim/version.c b/src/nvim/version.c index 487685ea2e..b652f5fee5 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -94,7 +94,7 @@ static int included_patches[] = { // 2350, // 2349, // 2348, - // 2347, + 2347, // 2346, // 2345 NA // 2344 NA |