getchar() in map-<expr> break internal state. Steps to reproduce: $ gvim -u NONE (I tested on Windows) :nnoremap <expr> x getchar()
Then, type "x" and "<C-Space>" (any key with modifier) Now, all mappings does not work. In the vgetc(), no_mapping and allow_keys are restored wrongly. getchar.c:vgetc() 1633 if (mod_mask) /* no mapping after modifier has been read */ 1634 { 1635 ++no_mapping; 1636 ++allow_keys; 1637 } 1638 c = vgetorpeek(TRUE); <- getchar() in map <expr> change mod_mask 1639 if (mod_mask) 1640 { 1641 --no_mapping; 1642 --allow_keys; 1643 } Please check the following patch. diff --git a/src/getchar.c b/src/getchar.c index a80432f..acf1c2f 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -4659,6 +4659,7 @@ eval_map_expr(str, c) pos_T save_cursor; int save_msg_col; int save_msg_row; + int save_mod_mask; /* Remove escaping of CSI, because "str" is in a format to be used as * typeahead. */ @@ -4684,6 +4685,7 @@ eval_map_expr(str, c) save_cursor = curwin->w_cursor; save_msg_col = msg_col; save_msg_row = msg_row; + save_mod_mask = mod_mask; /* getchar() may change mod_mask */ p = eval_to_string(expr, NULL, FALSE); --textlock; #ifdef FEAT_EX_EXTRA @@ -4692,6 +4694,7 @@ eval_map_expr(str, c) curwin->w_cursor = save_cursor; msg_col = save_msg_col; msg_row = save_msg_row; + mod_mask = save_mod_mask; restore_cmdline_alloc(save_cmd); vim_free(expr); -- Yukihiro Nakadaira - yukihiro.nakada...@gmail.com -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.