mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 8.0.0962: crash with virtualedit and joining lines
Problem: Crash with virtualedit and joining lines. (Joshua T Corbin, Neovim #6726) Solution: When using a mark check that coladd is valid.
This commit is contained in:
@@ -2274,6 +2274,7 @@ test_arglist \
|
|||||||
test_utf8_comparisons \
|
test_utf8_comparisons \
|
||||||
test_viminfo \
|
test_viminfo \
|
||||||
test_vimscript \
|
test_vimscript \
|
||||||
|
test_virtualedit \
|
||||||
test_visual \
|
test_visual \
|
||||||
test_window_cmd \
|
test_window_cmd \
|
||||||
test_window_id \
|
test_window_id \
|
||||||
|
11
src/misc2.c
11
src/misc2.c
@@ -605,7 +605,18 @@ check_cursor_col_win(win_T *win)
|
|||||||
else if (ve_flags == VE_ALL)
|
else if (ve_flags == VE_ALL)
|
||||||
{
|
{
|
||||||
if (oldcoladd > win->w_cursor.col)
|
if (oldcoladd > win->w_cursor.col)
|
||||||
|
{
|
||||||
win->w_cursor.coladd = oldcoladd - win->w_cursor.col;
|
win->w_cursor.coladd = oldcoladd - win->w_cursor.col;
|
||||||
|
if (win->w_cursor.col < len && win->w_cursor.coladd > 0)
|
||||||
|
{
|
||||||
|
int cs, ce;
|
||||||
|
|
||||||
|
/* check that coladd is not more than the char width */
|
||||||
|
getvcol(win, &win->w_cursor, &cs, NULL, &ce);
|
||||||
|
if (win->w_cursor.coladd > ce - cs)
|
||||||
|
win->w_cursor.coladd = ce - cs;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
/* avoid weird number when there is a miscalculation or overflow */
|
/* avoid weird number when there is a miscalculation or overflow */
|
||||||
win->w_cursor.coladd = 0;
|
win->w_cursor.coladd = 0;
|
||||||
|
@@ -1571,7 +1571,12 @@ do_pending_operator(cmdarg_T *cap, int old_col, int gui_yank)
|
|||||||
|
|
||||||
oap->start = VIsual;
|
oap->start = VIsual;
|
||||||
if (VIsual_mode == 'V')
|
if (VIsual_mode == 'V')
|
||||||
|
{
|
||||||
oap->start.col = 0;
|
oap->start.col = 0;
|
||||||
|
# ifdef FEAT_VIRTUALEDIT
|
||||||
|
oap->start.coladd = 0;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -7580,6 +7585,7 @@ nv_gomark(cmdarg_T *cap)
|
|||||||
if (!virtual_active())
|
if (!virtual_active())
|
||||||
curwin->w_cursor.coladd = 0;
|
curwin->w_cursor.coladd = 0;
|
||||||
#endif
|
#endif
|
||||||
|
check_cursor_col();
|
||||||
#ifdef FEAT_FOLDING
|
#ifdef FEAT_FOLDING
|
||||||
if (cap->oap->op_type == OP_NOP
|
if (cap->oap->op_type == OP_NOP
|
||||||
&& pos != NULL
|
&& pos != NULL
|
||||||
|
@@ -55,4 +55,5 @@ source test_taglist.vim
|
|||||||
source test_timers.vim
|
source test_timers.vim
|
||||||
source test_true_false.vim
|
source test_true_false.vim
|
||||||
source test_unlet.vim
|
source test_unlet.vim
|
||||||
|
source test_virtualedit.vim
|
||||||
source test_window_cmd.vim
|
source test_window_cmd.vim
|
||||||
|
31
src/testdir/test_virtualedit.vim
Normal file
31
src/testdir/test_virtualedit.vim
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
" Tests for 'virtualedit'.
|
||||||
|
|
||||||
|
func Test_yank_move_change()
|
||||||
|
split
|
||||||
|
call setline(1, [
|
||||||
|
\ "func foo() error {",
|
||||||
|
\ "\tif n, err := bar();",
|
||||||
|
\ "\terr != nil {",
|
||||||
|
\ "\t\treturn err",
|
||||||
|
\ "\t}",
|
||||||
|
\ "\tn = n * n",
|
||||||
|
\ ])
|
||||||
|
set virtualedit=all
|
||||||
|
set ts=4
|
||||||
|
function! MoveSelectionDown(count) abort
|
||||||
|
normal! m`
|
||||||
|
silent! exe "'<,'>move'>+".a:count
|
||||||
|
norm! ``
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
xmap ]e :<C-U>call MoveSelectionDown(v:count1)<CR>
|
||||||
|
2
|
||||||
|
normal 2gg
|
||||||
|
normal J
|
||||||
|
normal jVj
|
||||||
|
normal ]e
|
||||||
|
normal ce
|
||||||
|
bwipe!
|
||||||
|
set virtualedit=
|
||||||
|
set ts=8
|
||||||
|
endfunc
|
@@ -769,6 +769,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
962,
|
||||||
/**/
|
/**/
|
||||||
961,
|
961,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user