0
0
mirror of https://github.com/vim/vim.git synced 2025-10-23 08:44:20 -04:00

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 <girishji@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Girish Palya
2025-09-06 19:47:45 +02:00
committed by Christian Brabandt
parent 8fec92d631
commit 708ab7f5fb
4 changed files with 46 additions and 8 deletions

View File

@@ -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 VIM REFERENCE MANUAL by Bram Moolenaar
@@ -12416,18 +12416,19 @@ wildtrigger() *wildtrigger()*
produce a beep when no matches are found and generally produce a beep when no matches are found and generally
operates more quietly. This makes it suitable for triggering operates more quietly. This makes it suitable for triggering
completion automatically, such as from an |:autocmd|. completion automatically, such as from an |:autocmd|.
*cmdline-autocompletion* *cmdline-autocompletion*
Example: To make the completion menu pop up automatically as Example: To make the completion menu pop up automatically
you type on the command line, use: > while typing on the command line: >
autocmd CmdlineChanged [:/\?] call wildtrigger() autocmd CmdlineChanged [:/\?] call wildtrigger()
set wildmode=noselect:lastused,full wildoptions=pum set wildmode=noselect:lastused,full wildoptions=pum
< <
To retain normal history navigation (up/down keys): > To retain normal history navigation with the up/down keys: >
cnoremap <Up> <C-U><Up> cnoremap <expr> <Up> wildmenumode() ? "\<C-E>\<Up>" : "\<Up>"
cnoremap <Down> <C-U><Down> cnoremap <expr> <Down> wildmenumode() ? "\<C-E>\<Down>" : "\<Down>"
< <
To set an option specifically when performing a search, e.g. To apply an option only during a search, for example to set
to set 'pumheight': > 'pumheight': >
autocmd CmdlineEnter [/\?] set pumheight=8 autocmd CmdlineEnter [/\?] set pumheight=8
autocmd CmdlineLeave [/\?] set pumheight& autocmd CmdlineLeave [/\?] set pumheight&
< <

View File

@@ -1681,6 +1681,7 @@ getcmdline_int(
int wild_type = 0; int wild_type = 0;
int event_cmdlineleavepre_triggered = FALSE; int event_cmdlineleavepre_triggered = FALSE;
char_u *prev_cmdbuff = NULL; char_u *prev_cmdbuff = NULL;
int did_hist_navigate = FALSE;
// one recursion level deeper // one recursion level deeper
++depth; ++depth;
@@ -1891,6 +1892,13 @@ getcmdline_int(
c = safe_vgetc(); c = safe_vgetc();
} while (c == K_IGNORE || c == K_NOP); } 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) if (c == K_COMMAND || c == K_SCRIPT_COMMAND)
{ {
int clen = ccline.cmdlen; int clen = ccline.cmdlen;
@@ -2489,7 +2497,10 @@ getcmdline_int(
res = cmdline_browse_history(c, firstc, &lookfor, &lookforlen, histype, res = cmdline_browse_history(c, firstc, &lookfor, &lookforlen, histype,
&hiscnt, &xpc); &hiscnt, &xpc);
if (res == CMDLINE_CHANGED) if (res == CMDLINE_CHANGED)
{
did_hist_navigate = TRUE;
goto cmdline_changed; goto cmdline_changed;
}
else if (res == GOTO_NORMAL_MODE) else if (res == GOTO_NORMAL_MODE)
goto returncmd; goto returncmd;
} }

View File

@@ -5039,4 +5039,28 @@ func Test_CmdlineLeave_vchar_keys()
unlet g:leave_key unlet g:leave_key
endfunc 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 " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -724,6 +724,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1738,
/**/ /**/
1737, 1737,
/**/ /**/