summaryrefslogtreecommitdiffstats
path: root/src/ex_getln.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ex_getln.c')
-rw-r--r--src/ex_getln.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 5baffa77fb..711e08e886 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -1877,7 +1877,8 @@ getcmdline_int(
if (p_wmnu)
c = wildmenu_translate_key(&ccline, c, &xpc, did_wild_list);
- if (cmdline_pum_active())
+ int key_is_wc = (c == p_wc && KeyTyped) || c == p_wcm;
+ if (cmdline_pum_active() && !key_is_wc)
{
// Ctrl-Y: Accept the current selection and close the popup menu.
// Ctrl-E: cancel the cmdline popup menu and return the original
@@ -1897,7 +1898,7 @@ getcmdline_int(
// 'wildcharm' or Ctrl-N or Ctrl-P or Ctrl-A or Ctrl-L).
// If the popup menu is displayed, then PageDown and PageUp keys are
// also used to navigate the menu.
- end_wildmenu = (!(c == p_wc && KeyTyped) && c != p_wcm
+ end_wildmenu = (!key_is_wc
&& c != Ctrl_N && c != Ctrl_P && c != Ctrl_A && c != Ctrl_L);
end_wildmenu = end_wildmenu && (!cmdline_pum_active() ||
(c != K_PAGEDOWN && c != K_PAGEUP
@@ -2504,6 +2505,15 @@ returncmd:
cmdmsg_rl = FALSE;
#endif
+ // We could have reached here without having a chance to clean up wild menu
+ // if certain special keys like <Esc> or <C-\> were used as wildchar. Make
+ // sure to still clean up to avoid memory corruption.
+ if (cmdline_pum_active())
+ cmdline_pum_remove();
+ wildmenu_cleanup(&ccline);
+ did_wild_list = FALSE;
+ wim_index = 0;
+
ExpandCleanup(&xpc);
ccline.xpc = NULL;