From 708ab7f5fbef95c43a3eb6c0a2ad4e02ad4c2f98 Mon Sep 17 00:00:00 2001 From: Girish Palya Date: Sat, 6 Sep 2025 19:47:45 +0200 Subject: [PATCH] patch 9.1.1738: cmdline-autocompletion breaks history navigation Problem: cmdline-autocompletion breaks history navigation (ddad431) Solution: Support history navigation in cmdline autocompletion (Girish Palya) Up/Down arrows support history navigation when using wildtrigger() fixes: #18207 closes: #18219 Signed-off-by: Girish Palya Signed-off-by: Christian Brabandt --- runtime/doc/builtin.txt | 17 +++++++++-------- src/ex_getln.c | 11 +++++++++++ src/testdir/test_cmdline.vim | 24 ++++++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 40e6d93eb5..1b15246da1 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.1. Last change: 2025 Sep 02 +*builtin.txt* For Vim version 9.1. Last change: 2025 Sep 06 VIM REFERENCE MANUAL by Bram Moolenaar @@ -12416,18 +12416,19 @@ wildtrigger() *wildtrigger()* produce a beep when no matches are found and generally operates more quietly. This makes it suitable for triggering completion automatically, such as from an |:autocmd|. + *cmdline-autocompletion* - Example: To make the completion menu pop up automatically as - you type on the command line, use: > + Example: To make the completion menu pop up automatically + while typing on the command line: > autocmd CmdlineChanged [:/\?] call wildtrigger() set wildmode=noselect:lastused,full wildoptions=pum < - To retain normal history navigation (up/down keys): > - cnoremap - cnoremap + To retain normal history navigation with the up/down keys: > + cnoremap wildmenumode() ? "\\" : "\" + cnoremap wildmenumode() ? "\\" : "\" < - To set an option specifically when performing a search, e.g. - to set 'pumheight': > + To apply an option only during a search, for example to set + 'pumheight': > autocmd CmdlineEnter [/\?] set pumheight=8 autocmd CmdlineLeave [/\?] set pumheight& < diff --git a/src/ex_getln.c b/src/ex_getln.c index a7f957eab4..07c15ef2a8 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -1681,6 +1681,7 @@ getcmdline_int( int wild_type = 0; int event_cmdlineleavepre_triggered = FALSE; char_u *prev_cmdbuff = NULL; + int did_hist_navigate = FALSE; // one recursion level deeper ++depth; @@ -1891,6 +1892,13 @@ getcmdline_int( c = safe_vgetc(); } while (c == K_IGNORE || c == K_NOP); + // Skip wildmenu during history navigation via Up/Down keys + if (c == K_WILD && did_hist_navigate) + { + did_hist_navigate = FALSE; + continue; + } + if (c == K_COMMAND || c == K_SCRIPT_COMMAND) { int clen = ccline.cmdlen; @@ -2489,7 +2497,10 @@ getcmdline_int( res = cmdline_browse_history(c, firstc, &lookfor, &lookforlen, histype, &hiscnt, &xpc); if (res == CMDLINE_CHANGED) + { + did_hist_navigate = TRUE; goto cmdline_changed; + } else if (res == GOTO_NORMAL_MODE) goto returncmd; } diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index 09dfa3e93b..4e6b535159 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -5039,4 +5039,28 @@ func Test_CmdlineLeave_vchar_keys() unlet g:leave_key endfunc +" Skip wildmenu during history navigation via Up/Down keys +func Test_skip_wildtrigger_hist_navigation() + call test_override("char_avail", 1) + cnoremap =wildtrigger()[-1] + set wildmenu + + call feedkeys(":ech\\\\"\", "tx") + call assert_match('echo*', g:Sline) + call assert_equal('"echo', @:) + + call feedkeys(":echom \"foo\"", "tx") + call feedkeys(":echom \"foobar\"", "tx") + call feedkeys(":ech\\\\\"\", "tx") + call assert_equal('"echom "foobar"', @:) + call feedkeys(":ech\\\\\\\"\", "tx") + call assert_equal('"echom "foo"', @:) + call feedkeys(":ech\\\\\\\\"\", "tx") + call assert_equal('"echom "foobar"', @:) + + call test_override("char_avail", 0) + set wildmenu& + cunmap +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 596cd17dd8..06b7a5ba75 100644 --- a/src/version.c +++ b/src/version.c @@ -724,6 +724,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1738, /**/ 1737, /**/