diff src/screen.c @ 16374:57c37c17ff9d v8.1.1192

patch 8.1.1192: mode is not cleared when leaving Insert mode with mapped Esc commit https://github.com/vim/vim/commit/4c25bd785aa8b565bf973cbba12ed36b76daaa4f Author: Bram Moolenaar <Bram@vim.org> Date: Sat Apr 20 23:38:07 2019 +0200 patch 8.1.1192: mode is not cleared when leaving Insert mode with mapped Esc Problem: Mode is not cleared when leaving Insert mode with mapped Esc. Solution: Clear the mode when redraw_cmdline is set. (closes https://github.com/vim/vim/issues/4269)
author Bram Moolenaar <Bram@vim.org>
date Sat, 20 Apr 2019 23:45:04 +0200
parents 57e0f6b4a87d
children 840fa633ad64
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -790,7 +790,7 @@ update_screen(int type_arg)
 
     /* Clear or redraw the command line.  Done last, because scrolling may
      * mess up the command line. */
-    if (clear_cmdline || redraw_cmdline)
+    if (clear_cmdline || redraw_cmdline || redraw_mode)
 	showmode();
 
     if (no_update)
@@ -857,7 +857,7 @@ update_prepare(void)
     static void
 update_finish(void)
 {
-    if (redraw_cmdline)
+    if (redraw_cmdline || redraw_mode)
 	showmode();
 
 # ifdef FEAT_SEARCH_EXTRA
@@ -10128,7 +10128,7 @@ skip_showmode()
 	    || !redrawing()
 	    || (char_avail() && !KeyTyped))
     {
-	redraw_cmdline = TRUE;		// show mode later
+	redraw_mode = TRUE;		// show mode later
 	return TRUE;
     }
     return FALSE;
@@ -10140,6 +10140,7 @@ skip_showmode()
  * If clear_cmdline is TRUE, clear the rest of the cmdline.
  * If clear_cmdline is FALSE there may be a message there that needs to be
  * cleared only if a mode is shown.
+ * If redraw_mode is TRUE show or clear the mode.
  * Return the length of the message (0 if no message).
  */
     int
@@ -10313,7 +10314,7 @@ showmode(void)
 	}
 
 	mode_displayed = TRUE;
-	if (need_clear || clear_cmdline)
+	if (need_clear || clear_cmdline || redraw_mode)
 	    msg_clr_eos();
 	msg_didout = FALSE;		/* overwrite this message */
 	length = msg_col;
@@ -10323,6 +10324,11 @@ showmode(void)
     else if (clear_cmdline && msg_silent == 0)
 	/* Clear the whole command line.  Will reset "clear_cmdline". */
 	msg_clr_cmdline();
+    else if (redraw_mode)
+    {
+	msg_pos_mode();
+	msg_clr_eos();
+    }
 
 #ifdef FEAT_CMDL_INFO
     /* In Visual mode the size of the selected area must be redrawn. */
@@ -10335,6 +10341,7 @@ showmode(void)
 	win_redr_ruler(lastwin, TRUE, FALSE);
 #endif
     redraw_cmdline = FALSE;
+    redraw_mode = FALSE;
     clear_cmdline = FALSE;
 
     return length;