Mercurial > vim
diff src/getchar.c @ 27624:ec52847967d8 v8.2.4338
patch 8.2.4338: an error from an expression mapping messes up the display
Commit: https://github.com/vim/vim/commit/74a0a5b26d0180f3ea89e9495dff6a26f0df23cb
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Feb 10 14:07:41 2022 +0000
patch 8.2.4338: an error from an expression mapping messes up the display
Problem: An error from an expression mapping messes up the display.
Solution: When the expression results in an empty string return K_IGNORE.
In cmdline mode redraw the command line. (closes #9726)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 10 Feb 2022 15:15:04 +0100 |
parents | 4c7bb6fd383f |
children | 4cc78957f550 |
line wrap: on
line diff
--- a/src/getchar.c +++ b/src/getchar.c @@ -2840,6 +2840,7 @@ handle_mapping( int save_may_garbage_collect = may_garbage_collect; int was_screen_col = screen_cur_col; int was_screen_row = screen_cur_row; + int prev_did_emsg = did_emsg; vgetc_busy = 0; may_garbage_collect = FALSE; @@ -2852,6 +2853,29 @@ handle_mapping( windgoto(was_screen_row, was_screen_col); out_flush(); + // If an error was displayed and the expression returns an empty + // string, generate a <Nop> to allow for a redraw. + if (prev_did_emsg != did_emsg + && (map_str == NULL || *map_str == NUL)) + { + char_u buf[4]; + + vim_free(map_str); + buf[0] = K_SPECIAL; + buf[1] = KS_EXTRA; + buf[2] = KE_IGNORE; + buf[3] = NUL; + map_str = vim_strsave(buf); + if (State & CMDLINE) + { + // redraw the command below the error + msg_didout = TRUE; + if (msg_row < cmdline_row) + msg_row = cmdline_row; + redrawcmd(); + } + } + vgetc_busy = save_vgetc_busy; may_garbage_collect = save_may_garbage_collect; }