]> granicus.if.org Git - vim/commitdiff
patch 8.1.1192: mode is not cleared when leaving Insert mode with mapped Esc v8.1.1192
authorBram Moolenaar <Bram@vim.org>
Sat, 20 Apr 2019 21:38:07 +0000 (23:38 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 20 Apr 2019 21:38:07 +0000 (23:38 +0200)
Problem:    Mode is not cleared when leaving Insert mode with mapped Esc.
Solution:   Clear the mode when redraw_cmdline is set. (closes #4269)

src/globals.h
src/screen.c
src/testdir/test_messages.vim
src/version.c

index 6f4144aefc6029dea9a2f924ef7779165a5e4172..e3a2c3b1af4322f79938c7da63c672471424d05f 100644 (file)
@@ -90,12 +90,13 @@ EXTERN int  mod_mask INIT(= 0x0);           /* current key modifiers */
  */
 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 */
index 1c21b7430f68f045fdb42aa6964c3aebd746c427..67a0db943de216d8449eb3d4c86cc920979a1193 100644 (file)
@@ -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;
index 2d1d6d9b977a686c7fabeca25b3ff25ac7637e79..5708183ed4ef93f96fa272cc7755effc38f5bb4d 100644 (file)
@@ -125,3 +125,31 @@ func Test_mode_message_at_leaving_insert_by_ctrl_c()
   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
index 7fc39ae318e1a58beca2635fec6eb459c9e9ca15..2448efd43d30c8b8f28b64c064415e7b53b1005f 100644 (file)
@@ -771,6 +771,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1192,
 /**/
     1191,
 /**/