diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-08-24 10:28:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-24 10:28:32 +0800 |
commit | 9a100ee169f80cbfe45872939ed9b4f70f6bfe3f (patch) | |
tree | d9a3580d0934d46dd594e05d091e09fd4e0cbc4f /src | |
parent | 64d147b4719310093ca2d728ba68b23f7e0660df (diff) | |
download | rneovim-9a100ee169f80cbfe45872939ed9b4f70f6bfe3f.tar.gz rneovim-9a100ee169f80cbfe45872939ed9b4f70f6bfe3f.tar.bz2 rneovim-9a100ee169f80cbfe45872939ed9b4f70f6bfe3f.zip |
fix(cmdline): do not trigger completion at wrong time (#19920)
Cherry-picked from Vim patches 8.2.4339, 9.0.0238.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/ex_getln.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 0dce2fd2e2..febfff41e1 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -1277,8 +1277,11 @@ static int command_line_execute(VimState *state, int key) // <S-Tab> goes to last match, in a clumsy way if (s->c == K_S_TAB && KeyTyped) { if (nextwild(&s->xpc, WILD_EXPAND_KEEP, 0, s->firstc != '@') == OK) { - // Trigger the popup menu when wildoptions=pum - showmatches(&s->xpc, p_wmnu && ((wim_flags[s->wim_index] & WIM_LIST) == 0)); + if (s->xpc.xp_numfiles > 1 + && ((!s->did_wild_list && (wim_flags[s->wim_index] & WIM_LIST)) || p_wmnu)) { + // Trigger the popup menu when wildoptions=pum + showmatches(&s->xpc, p_wmnu && ((wim_flags[s->wim_index] & WIM_LIST) == 0)); + } nextwild(&s->xpc, WILD_PREV, 0, s->firstc != '@'); nextwild(&s->xpc, WILD_PREV, 0, s->firstc != '@'); return command_line_changed(s); @@ -1798,13 +1801,16 @@ static int command_line_handle_key(CommandLineState *s) return command_line_not_changed(s); case Ctrl_A: // all matches - if (nextwild(&s->xpc, WILD_ALL, 0, s->firstc != '@') == FAIL) { - break; - } if (cmdline_pum_active()) { + // As Ctrl-A completes all the matches, close the popup + // menu (if present) cmdline_pum_cleanup(&ccline); - s->xpc.xp_context = EXPAND_NOTHING; } + if (nextwild(&s->xpc, WILD_ALL, 0, s->firstc != '@') == FAIL) { + break; + } + s->xpc.xp_context = EXPAND_NOTHING; + s->did_wild_list = false; return command_line_changed(s); case Ctrl_L: |