patch 9.1.1738: cmdline-autocompletion breaks history navigation
Commit:
https://github.com/vim/vim/commit/708ab7f5fbef95c43a3eb6c0a2ad4e02ad4c2f98
Author: Girish Palya <
giri...@gmail.com>
Date: Sat Sep 6 19:47:45 2025 +0200
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 <
giri...@gmail.com>
Signed-off-by: Christian Brabandt <
c...@256bit.org>
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index 40e6d93eb..1b15246da 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 <Up> <C-U><Up>
- cnoremap <Down> <C-U><Down>
+ To retain normal history navigation with the up/down keys: >
+ cnoremap <expr> <Up> wildmenumode() ? "\<C-E>\<Up>" : "\<Up>"
+ cnoremap <expr> <Down> wildmenumode() ? "\<C-E>\<Down>" : "\<Down>"
<
- 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 a7f957eab..07c15ef2a 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 09dfa3e93..4e6b53515 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 <F8> <C-R>=wildtrigger()[-1]<CR>
+ set wildmenu
+
+ call feedkeys(":ech\<F8>\<F4>\<C-B>\"\<CR>", "tx")
+ call assert_match('echo*', g:Sline)
+ call assert_equal('"echo', @:)
+
+ call feedkeys(":echom \"foo\"", "tx")
+ call feedkeys(":echom \"foobar\"", "tx")
+ call feedkeys(":ech\<F8>\<C-E>\<UP>\<C-B>\"\<CR>", "tx")
+ call assert_equal('"echom "foobar"', @:)
+ call feedkeys(":ech\<F8>\<C-E>\<UP>\<UP>\<UP>\<C-B>\"\<CR>", "tx")
+ call assert_equal('"echom "foo"', @:)
+ call feedkeys(":ech\<F8>\<C-E>\<UP>\<UP>\<UP>\<Down>\<C-B>\"\<CR>", "tx")
+ call assert_equal('"echom "foobar"', @:)
+
+ call test_override("char_avail", 0)
+ set wildmenu&
+ cunmap <F8>
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 596cd17dd..06b7a5ba7 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,
/**/