]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1428: cursor in wrong position when leaving insert mode v9.0.1428
authorBram Moolenaar <Bram@vim.org>
Sat, 25 Mar 2023 20:06:49 +0000 (20:06 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 25 Mar 2023 20:06:49 +0000 (20:06 +0000)
Problem:    Cursor in wrong position when leaving insert mode.
Solution:   Update the w_valid flags.  Position the cursor also when not
            redrawing. (closes #12137)

src/edit.c
src/main.c
src/testdir/dumps/Test_edit_ctlr_r_failed_1.dump [new file with mode: 0644]
src/testdir/test_edit.vim
src/version.c

index 212efae3d4e6213916ba7bca8598007537ca9108..84b6eef4b6f1fe31285ea8756669de602afb8f5a 100644 (file)
@@ -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();
index d1c42ed12061923eca9590d687a7e3ae7c61c6e5..f5d3cb419329de1925c150d4422be188c83dbf97 100644 (file)
@@ -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 (file)
index 0000000..26eb1a4
--- /dev/null
@@ -0,0 +1,6 @@
+>:+0&#ffffff0| @58
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+| +0#0000000&@59
index 79e3c3fd22c8a41f032041dea2f0de4a969095a5..3ce542114295c0bcacf1fa3ca716379cff64f0bf 100644 (file)
@@ -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\<C-R>={}\<CR>")
+
+  " ending Insert mode should put the cursor back on the ':'
+  call term_sendkeys(buf, ":\<Esc>")
+  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.
index 0a4a8a052401a6583466b5925891136e7cb7be50..f25f59fc843f9472ca93e8227b596d3d5e1d4efa 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1428,
 /**/
     1427,
 /**/