diff --git a/src/autocmd.c b/src/autocmd.c index 862370fc6e..37f2480a88 100644 --- a/src/autocmd.c +++ b/src/autocmd.c @@ -1424,8 +1424,6 @@ ex_doautoall(exarg_T *eap) if (call_do_modelines && did_aucmd) do_modelines(0); } - - check_cursor(); // just in case lines got deleted } /* @@ -1532,6 +1530,10 @@ aucmd_prepbuf( curbuf = buf; aco->new_curwin_id = curwin->w_id; set_bufref(&aco->new_curbuf, curbuf); + + // disable the Visual area, the position may be invalid in another buffer + aco->save_VIsual_active = VIsual_active; + VIsual_active = FALSE; } /* @@ -1656,6 +1658,11 @@ win_found: check_cursor(); } } + + check_cursor(); // just in case lines got deleted + VIsual_active = aco->save_VIsual_active; + if (VIsual_active) + check_pos(curbuf, &VIsual); } static int autocmd_nested = FALSE; diff --git a/src/structs.h b/src/structs.h index 197df720c5..9d5768175f 100644 --- a/src/structs.h +++ b/src/structs.h @@ -4031,6 +4031,7 @@ typedef struct int save_prevwin_id; // ID of saved prevwin bufref_T new_curbuf; // new curbuf char_u *globaldir; // saved value of globaldir + int save_VIsual_active; // saved VIsual_active } aco_save_T; /* diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index b6f621dbff..1fc960f537 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -2812,6 +2812,16 @@ func Test_close_autocmd_tab() %bwipe! endfunc +func Test_Visual_doautoall_redraw() + call setline(1, ['a', 'b']) + new + wincmd p + call feedkeys("G\", 'txn') + autocmd User Explode ++once redraw + doautoall User Explode + %bwipe! +endfunc + " This was using freed memory. func Test_BufNew_arglocal() arglocal diff --git a/src/version.c b/src/version.c index 731f8cef1d..53202e5159 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4028, /**/ 4027, /**/