changeset 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 e400a838865d
children 0556eeb51945
files src/globals.h src/screen.c src/testdir/test_messages.vim src/version.c
diffstat 4 files changed, 47 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/globals.h
+++ b/src/globals.h
@@ -90,12 +90,13 @@ EXTERN int	mod_mask INIT(= 0x0);		/* cur
  */
 EXTERN int	cmdline_row;
 
-EXTERN int	redraw_cmdline INIT(= FALSE);	/* cmdline must be redrawn */
-EXTERN int	clear_cmdline INIT(= FALSE);	/* cmdline must be cleared */
-EXTERN int	mode_displayed INIT(= FALSE);	/* mode is being displayed */
-EXTERN int	no_win_do_lines_ins INIT(= FALSE); /* don't insert lines */
+EXTERN int	redraw_cmdline INIT(= FALSE);	// cmdline must be redrawn
+EXTERN int	redraw_mode INIT(= FALSE);	// mode must be redrawn
+EXTERN int	clear_cmdline INIT(= FALSE);	// cmdline must be cleared
+EXTERN int	mode_displayed INIT(= FALSE);	// mode is being displayed
+EXTERN int	no_win_do_lines_ins INIT(= FALSE); // don't insert lines
 #if defined(FEAT_CRYPT) || defined(FEAT_EVAL)
-EXTERN int	cmdline_star INIT(= FALSE);	/* cmdline is crypted */
+EXTERN int	cmdline_star INIT(= FALSE);	// cmdline is crypted
 #endif
 
 EXTERN int	exec_from_reg INIT(= FALSE);	/* executing register */
--- 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;
--- a/src/testdir/test_messages.vim
+++ b/src/testdir/test_messages.vim
@@ -125,3 +125,31 @@ func Test_mode_message_at_leaving_insert
   exe buf . 'bwipe!'
   call delete(testfile)
 endfunc
+
+func Test_mode_message_at_leaving_insert_with_esc_mapped()
+  if !has('terminal') || has('gui_running')
+    return
+  endif
+
+  " Set custom statusline built by user-defined function.
+  let testfile = 'Xtest.vim'
+  call writefile([
+        \ 'set laststatus=2',
+        \ 'inoremap <Esc> <Esc>00',
+        \ ], testfile)
+
+  let rows = 10
+  let buf = term_start([GetVimProg(), '--clean', '-S', testfile], {'term_rows': rows})
+  call term_wait(buf, 200)
+  call assert_equal('run', job_status(term_getjob(buf)))
+
+  call term_sendkeys(buf, "i")
+  call WaitForAssert({-> assert_match('^-- INSERT --\s*$', term_getline(buf, rows))})
+  call term_sendkeys(buf, "\<Esc>")
+  call WaitForAssert({-> assert_match('^\s*$', term_getline(buf, rows))})
+
+  call term_sendkeys(buf, ":qall!\<CR>")
+  call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))})
+  exe buf . 'bwipe!'
+  call delete(testfile)
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1192,
+/**/
     1191,
 /**/
     1190,