diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-02-17 07:18:10 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-02-17 08:45:14 +0800 |
commit | 2ffe66a5a4e1297ee24fd3ab8cc4dda45b1381bd (patch) | |
tree | ed6ce83164b6c3dfe3c5a49d9627e4792ab85f35 /src/nvim/getchar.c | |
parent | c90cf8c77b96cda0fd40dbf4aa2c1762cd09dab3 (diff) | |
download | rneovim-2ffe66a5a4e1297ee24fd3ab8cc4dda45b1381bd.tar.gz rneovim-2ffe66a5a4e1297ee24fd3ab8cc4dda45b1381bd.tar.bz2 rneovim-2ffe66a5a4e1297ee24fd3ab8cc4dda45b1381bd.zip |
vim-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 vim/vim#9726)
https://github.com/vim/vim/commit/74a0a5b26d0180f3ea89e9495dff6a26f0df23cb
Diffstat (limited to 'src/nvim/getchar.c')
-rw-r--r-- | src/nvim/getchar.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index ac5d587c1e..43a4f31478 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -1953,6 +1953,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) const bool save_may_garbage_collect = may_garbage_collect; const int save_cursor_row = ui_current_row(); const int save_cursor_col = ui_current_col(); + const int prev_did_emsg = did_emsg; vgetc_busy = 0; may_garbage_collect = false; @@ -1968,6 +1969,26 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) ui_cursor_goto(save_cursor_row, save_cursor_col); ui_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]; + xfree(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; } else { |