vim-patch:9.1.1931: completion: wrong item selected with fuzzy and noinsert (#36725)

Problem:  completion: wrong item selected with fuzzy and noinsert
          (Evgeni Chasnovski)
Solution: Reset selected item after fuzzy sort
          (Girish Palya)

fixes: vim/vim#18802
closes: vim/vim#18816

057ea1232a

Co-authored-by: Girish Palya <girishji@gmail.com>
This commit is contained in:
zeertzjq
2025-11-28 09:07:22 +08:00
committed by GitHub
parent a4e867c964
commit 19d5b28977
2 changed files with 17 additions and 7 deletions

View File

@@ -2247,16 +2247,17 @@ static void ins_compl_fuzzy_sort(void)
{
unsigned cur_cot_flags = get_cot_flags();
// set the fuzzy score in cp_score
// Set the fuzzy score in cp_score and sort
set_fuzzy_score();
// Sort the matches linked list based on fuzzy score
if (!(cur_cot_flags & kOptCotFlagNosort)) {
sort_compl_match_list(cp_compare_fuzzy);
if ((cur_cot_flags & (kOptCotFlagNoinsert|kOptCotFlagNoselect)) == kOptCotFlagNoinsert
&& compl_first_match) {
compl_shown_match = compl_first_match;
if (compl_shows_dir_forward() && !compl_autocomplete) {
compl_shown_match = compl_first_match->cp_next;
// Reset the shown item since sorting reorders items
if ((cur_cot_flags & (kOptCotFlagNoinsert|kOptCotFlagNoselect)) == kOptCotFlagNoinsert) {
bool none_selected = compl_shown_match == (compl_shows_dir_forward()
? compl_first_match : compl_first_match->cp_prev);
if (!none_selected) {
compl_shown_match = (!compl_autocomplete && compl_shows_dir_forward())
? compl_first_match->cp_next : compl_first_match;
}
}
}

View File

@@ -3703,6 +3703,15 @@ func Test_complete_opt_fuzzy()
call feedkeys("Gof\<C-N>\<C-R>=PrintMenuWords()\<CR>\<Esc>0", 'tx')
call assert_equal('f{''items'': [''func1'', ''func2'', ''xfunc'']}', getline('.'))
" Issue #18802: Reset selected item after fuzzy sort
%d
call setline(1, ['aa', 'aaa', 'aaaa'])
set completeopt=menuone,noinsert,fuzzy
call feedkeys("Goa\<C-N>\<C-Y>\<Esc>", 'tx')
call assert_equal('aa', getline('.'))
call feedkeys("Goa\<C-P>\<C-Y>\<Esc>", 'tx')
call assert_equal('aaaa', getline('.'))
" clean up
set omnifunc=
bw!