diff --git a/src/nvim/cmdexpand.c b/src/nvim/cmdexpand.c index 36d0b0fbe1..472476a05b 100644 --- a/src/nvim/cmdexpand.c +++ b/src/nvim/cmdexpand.c @@ -390,6 +390,7 @@ static int cmdline_pum_create(CmdlineInfo *ccline, expand_T *xp, char **matches, // no default selection compl_selected = -1; + pum_clear(); cmdline_pum_display(true); return EXPAND_OK; diff --git a/test/functional/ui/popupmenu_spec.lua b/test/functional/ui/popupmenu_spec.lua index f03341cc11..b5d1433478 100644 --- a/test/functional/ui/popupmenu_spec.lua +++ b/test/functional/ui/popupmenu_spec.lua @@ -5262,6 +5262,49 @@ describe('builtin popupmenu', function() ]]) end) + -- oldtest: Test_pum_scroll_noselect() + it('cmdline pum does not retain scroll position with "noselect"', function() + screen:try_resize(32, 10) + exec([[ + command! -nargs=* -complete=customlist,TestFn TestCmd echo + func TestFn(a, b, c) + return map(range(1, 50), 'printf("a%d", v:val)') + endfunc + set wildmode=noselect,full + set wildoptions=pum + set wildmenu + set noruler + ]]) + + feed(':TestCmd ' .. (''):rep(20)) + screen:expect([[ + {n: a15 }{s: } | + {1:~ }{n: a16 }{s: }{1: }| + {1:~ }{n: a17 }{s: }{1: }| + {1:~ }{n: a18 }{c: }{1: }| + {1:~ }{n: a19 }{s: }{1: }| + {1:~ }{s: a20 }{1: }| + {1:~ }{n: a21 }{s: }{1: }| + {1:~ }{n: a22 }{s: }{1: }| + {1:~ }{n: a23 }{s: }{1: }| + :TestCmd a20^ | + ]]) + + feed(':TestCmd ') + screen:expect([[ + {n: a1 }{c: } | + {1:~ }{n: a2 }{s: }{1: }| + {1:~ }{n: a3 }{s: }{1: }| + {1:~ }{n: a4 }{s: }{1: }| + {1:~ }{n: a5 }{s: }{1: }| + {1:~ }{n: a6 }{s: }{1: }| + {1:~ }{n: a7 }{s: }{1: }| + {1:~ }{n: a8 }{s: }{1: }| + {1:~ }{n: a9 }{s: }{1: }| + :TestCmd ^ | + ]]) + end) + it( 'cascading highlights for matched text (PmenuMatch, PmenuMatchSel) in cmdline pum', function() diff --git a/test/old/testdir/test_cmdline.vim b/test/old/testdir/test_cmdline.vim index 78001db838..34caeea303 100644 --- a/test/old/testdir/test_cmdline.vim +++ b/test/old/testdir/test_cmdline.vim @@ -4639,4 +4639,35 @@ func Test_range_complete() set wildcharm=0 endfunc +" With 'noselect' in 'wildmode', ensure that the popup menu (pum) does not retain +" its scroll position after reopening. The menu should open showing the top items, +" regardless of previous scrolling. +func Test_pum_scroll_noselect() + CheckScreendump + + let lines =<< trim [SCRIPT] + command! -nargs=* -complete=customlist,TestFn TestCmd echo + func TestFn(a, b, c) + return map(range(1, 50), 'printf("a%d", v:val)') + endfunc + set wildmode=noselect,full + set wildoptions=pum + set wildmenu + set noruler + [SCRIPT] + call writefile(lines, 'XTest_pum_scroll', 'D') + let buf = RunVimInTerminal('-S XTest_pum_scroll', {'rows': 10}) + + call term_sendkeys(buf, ":TestCmd \" . repeat("\", 20)) + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_pum_scroll_noselect_1', {}) + + call term_sendkeys(buf, "\:TestCmd \") + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_pum_scroll_noselect_2', {}) + + call term_sendkeys(buf, "\") + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab