patch 9.1.1931: completion: wrong item selected with fuzzy and noinsert
Commit:
https://github.com/vim/vim/commit/057ea1232a4b5402616705d698a9edfde94d490b
Author: Girish Palya <
giri...@gmail.com>
Date: Thu Nov 27 20:20:38 2025 +0000
patch 9.1.1931: completion: wrong item selected with fuzzy and noinsert
Problem: completion: wrong item selected with fuzzy and noinsert
(Evgeni Chasnovski)
Solution: Reset selected item after fuzzy sort
(Girish Palya)
fixes: #18802
closes: #18816
Signed-off-by: Girish Palya <
giri...@gmail.com>
Signed-off-by: Christian Brabandt <
c...@256bit.org>
diff --git a/src/insexpand.c b/src/insexpand.c
index ea4ce495b..1bcadadf8 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -2480,18 +2480,20 @@ ins_compl_fuzzy_sort(void)
{
int 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 & COT_NOSORT))
{
sort_compl_match_list(cp_compare_fuzzy);
- if ((cur_cot_flags & (COT_NOINSERT | COT_NOSELECT)) == COT_NOINSERT
- && 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 & (COT_NOINSERT | COT_NOSELECT)) == COT_NOINSERT)
+ {
+ int 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;
}
}
}
diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim
index c2268682f..194422b34 100644
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -3593,6 +3593,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!
diff --git a/src/version.c b/src/version.c
index e2619a339..75095d126 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1931,
/**/
1930,
/**/