diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-09-08 23:35:30 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-09-08 23:35:30 +0200 |
commit | c4a908e83690844b0d3a46124ba6af7d23485d69 (patch) | |
tree | 1a38f95d4fb857bd49b70a60e9de225c19b4574a | |
parent | abd468ed0fbcba391e7833feeaa7de3ced841455 (diff) | |
download | vim-git-c4a908e83690844b0d3a46124ba6af7d23485d69.tar.gz |
patch 7.4.2347v7.4.2347
Problem: Crash when closing a buffer while Visual mode is active.
(Dominique Pelle)
Solution: Adjust the position before computing the number of lines.
When closing the current buffer stop Visual mode.
-rw-r--r-- | src/buffer.c | 9 | ||||
-rw-r--r-- | src/normal.c | 5 | ||||
-rw-r--r-- | src/testdir/test_normal.vim | 14 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 27 insertions, 3 deletions
diff --git a/src/buffer.c b/src/buffer.c index 398fee7b6..3bfd97522 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -578,6 +578,11 @@ aucmd_abort: if (buf->b_ffname == NULL) del_buf = TRUE; + /* When closing the current buffer stop Visual mode before freeing + * anything. */ + if (buf == curbuf) + end_visual_mode(); + /* * Free all things allocated for this buffer. * Also calls the "BufDelete" autocommands when del_buf is TRUE. @@ -1379,6 +1384,10 @@ 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/normal.c b/src/normal.c index edaa740e4..92ef575d2 100644 --- a/src/normal.c +++ b/src/normal.c @@ -1609,6 +1609,8 @@ do_pending_operator(cmdarg_T *cap, int old_col, int 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; #ifdef FEAT_VIRTUALEDIT @@ -9451,10 +9453,7 @@ get_op_vcol( #ifdef FEAT_MBYTE /* prevent from moving onto a trail byte */ if (has_mbyte) - { - check_pos(curwin->w_buffer, &oap->end); mb_adjustpos(curwin->w_buffer, &oap->end); - } #endif getvvcol(curwin, &(oap->start), &oap->start_vcol, NULL, &oap->end_vcol); diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index b894a633c..79af7b258 100644 --- a/src/testdir/test_normal.vim +++ b/src/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/version.c b/src/version.c index 55f854109..8740a985e 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2347, +/**/ 2346, /**/ 2345, |