From: Luuk van Baal Date: Wed, 15 Feb 2023 16:45:27 +0000 (+0000) Subject: patch 9.0.1312: Cursor position wrong when splitting window in insert mode X-Git-Tag: v9.0.1312 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc3dc298b37820a8212e7d839e882e07d6cc98c8;p=vim patch 9.0.1312: Cursor position wrong when splitting window in insert mode Problem: Cursor position wrong when splitting window in insert mode. Solution: Pass the actual mode to win_fix_cursor(). (Luuk van Baal, closes #11999, --- diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim index 1441db584..969edff26 100644 --- a/src/testdir/test_window_cmd.vim +++ b/src/testdir/test_window_cmd.vim @@ -1753,14 +1753,7 @@ func Test_splitkeep_options() " Scroll when cursor becomes invalid in insert mode. norm Lic - call assert_equal(curpos[0], getcurpos()[0], 'run ' .. run) - - " The line number might be one less because of round-off. - call assert_inrange(curpos[1] - 1, curpos[1], getcurpos()[1], 'run ' .. run) - - call assert_equal(curpos[2], getcurpos()[2], 'run ' .. run) - call assert_equal(curpos[3], getcurpos()[3], 'run ' .. run) - call assert_equal(curpos[4], getcurpos()[4], 'run ' .. run) + call assert_equal(curpos, getcurpos(), 'run ' .. run) " No scroll when topline not equal to 1 only | execute "norm gg5\" | split | wincmd k diff --git a/src/version.c b/src/version.c index c59a3a1df..080c3ad0c 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1312, /**/ 1311, /**/ diff --git a/src/window.c b/src/window.c index 234d2a87f..e90333249 100644 --- a/src/window.c +++ b/src/window.c @@ -5328,7 +5328,10 @@ win_enter_ext(win_T *wp, int flags) if (*p_spk == 'c') // assume cursor position needs updating changed_line_abv_curs(); else - win_fix_cursor(TRUE); + // Make sure the cursor position is valid, either by moving the cursor + // or by scrolling the text. + win_fix_cursor( + get_real_state() & (MODE_NORMAL|MODE_CMDLINE|MODE_TERMINAL)); // Now it is OK to parse messages again, which may be needed in // autocommands. @@ -6782,7 +6785,8 @@ win_fix_scroll(int resize) /* * Make sure the cursor position is valid for 'splitkeep'. * If it is not, put the cursor position in the jumplist and move it. - * If we are not in normal mode, scroll to make valid instead. + * If we are not in normal mode ("normal" is zero), make it valid by scrolling + * instead. */ static void win_fix_cursor(int normal)