# HG changeset patch # User Bram Moolenaar # Date 1555796704 -7200 # Node ID 57c37c17ff9d85efbdc6751af042e5a3f953d86e # Parent e400a838865d89b55bd07c4db0d17478b82933b8 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 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) diff --git a/src/globals.h b/src/globals.h --- 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 */ diff --git a/src/screen.c b/src/screen.c --- 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; diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim --- 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 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, "\") + call WaitForAssert({-> assert_match('^\s*$', term_getline(buf, rows))}) + + call term_sendkeys(buf, ":qall!\") + call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))}) + exe buf . 'bwipe!' + call delete(testfile) +endfunc diff --git a/src/version.c b/src/version.c --- 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,