From a062006b9de0b2947ab5fb376c6e67ef92a8cd69 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 17 Nov 2021 16:52:40 +0000 Subject: [PATCH] patch 8.2.3610: crash when ModeChanged triggered too early Problem: Crash when ModeChanged triggered too early. Solution: Trigger ModeChanged after setting VIsual. --- src/normal.c | 2 +- src/testdir/test_edit.vim | 10 +++++++++- src/version.c | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/normal.c b/src/normal.c index 11b61f92a6cf9..059baee90faab 100644 --- a/src/normal.c +++ b/src/normal.c @@ -5778,7 +5778,6 @@ n_start_visual_mode(int c) VIsual_mode = c; VIsual_active = TRUE; VIsual_reselect = TRUE; - trigger_modechanged(); // Corner case: the 0 position in a tab may change when going into // virtualedit. Recalculate curwin->w_cursor to avoid bad highlighting. @@ -5793,6 +5792,7 @@ n_start_visual_mode(int c) foldAdjustVisual(); #endif + trigger_modechanged(); setmouse(); #ifdef FEAT_CONCEAL // Check if redraw is needed after changing the state. diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim index 957f248fc737d..bea1b762ee78e 100644 --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -2037,7 +2037,15 @@ endfunc func Test_recursive_ModeChanged() au! ModeChanged * norm 0u sil! norm  - au! + au! ModeChanged +endfunc + +func Test_ModeChanged_starts_visual() + " This was triggering ModeChanged before setting VIsual, causing a crash. + au! ModeChanged * norm 0u + sil! norm  + + au! ModeChanged endfunc " Test toggling of input method. See :help i_CTRL-^ diff --git a/src/version.c b/src/version.c index 55928db1963c1..d301120079e69 100644 --- a/src/version.c +++ b/src/version.c @@ -757,6 +757,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3610, /**/ 3609, /**/