# HG changeset patch # User Bram Moolenaar # Date 1679775305 -3600 # Node ID baafb135b0cbfb588a657ef74fd4833bc87464a4 # Parent 36885921be18d8a89c0ac2591af910ad770481bf patch 9.0.1428: cursor in wrong position when leaving insert mode Commit: https://github.com/vim/vim/commit/c174c2e58c9e24a75b189e01143e6d057b84e96e Author: Bram Moolenaar Date: Sat Mar 25 20:06:49 2023 +0000 patch 9.0.1428: cursor in wrong position when leaving insert mode Problem: Cursor in wrong position when leaving insert mode. Solution: Update the w_valid flags. Position the cursor also when not redrawing. (closes #12137) diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -3688,6 +3688,7 @@ ins_esc( else { --curwin->w_cursor.col; + curwin->w_valid &= ~(VALID_WCOL|VALID_VIRTCOL); // Correct cursor for multi-byte character. if (has_mbyte) mb_adjust_cursor(); diff --git a/src/main.c b/src/main.c --- a/src/main.c +++ b/src/main.c @@ -305,7 +305,7 @@ main params.want_full_screen = FALSE; /* - * When certain to start the GUI, don't check capabilities of terminal. + * When certain to start the GUI, don't check terminal capabilities. * For GTK we can't be sure, but when started from the desktop it doesn't * make sense to try using a terminal. */ @@ -1290,7 +1290,11 @@ main_loop( * update cursor and redraw. */ if (skip_redraw || exmode_active) + { skip_redraw = FALSE; + setcursor(); + cursor_on(); + } else if (do_redraw || stuff_empty()) { #ifdef FEAT_GUI diff --git a/src/testdir/dumps/Test_edit_ctlr_r_failed_1.dump b/src/testdir/dumps/Test_edit_ctlr_r_failed_1.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_edit_ctlr_r_failed_1.dump @@ -0,0 +1,6 @@ +>:+0&#ffffff0| @58 +|~+0#4040ff13&| @58 +|~| @58 +|~| @58 +|~| @58 +| +0#0000000&@59 diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -5,6 +5,7 @@ if exists("+t_kD") endif source check.vim +source screendump.vim " Needed for testing basic rightleft: Test_edit_rightleft source view_util.vim @@ -1957,6 +1958,22 @@ func Test_edit_insert_reg() close! endfunc +" Test for positioning cursor after CTRL-R expression failed +func Test_edit_ctrl_r_failed() + CheckRunVimInTerminal + + let buf = RunVimInTerminal('', #{rows: 6, cols: 60}) + + " trying to insert a dictionary produces an error + call term_sendkeys(buf, "i\={}\") + + " ending Insert mode should put the cursor back on the ':' + call term_sendkeys(buf, ":\") + call VerifyScreenDump(buf, 'Test_edit_ctlr_r_failed_1', {}) + + call StopVimInTerminal(buf) +endfunc + " When a character is inserted at the last position of the last line in a " window, the window contents should be scrolled one line up. If the top line " is part of a fold, then the entire fold should be scrolled up. diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1428, +/**/ 1427, /**/ 1426,