Commit: patch 9.1.1315: completion: issue with fuzzy completion and 'completefuzzycollect'

3 views
Skip to first unread message

Christian Brabandt

unread,
Apr 17, 2025, 2:30:12 PM4/17/25
to vim...@googlegroups.com
patch 9.1.1315: completion: issue with fuzzy completion and 'completefuzzycollect'

Commit: https://github.com/vim/vim/commit/cfe502c5753cce2080ddabdfdcacb8e4b3092721
Author: glepnir <gleph...@gmail.com>
Date: Thu Apr 17 20:17:53 2025 +0200

patch 9.1.1315: completion: issue with fuzzy completion and 'completefuzzycollect'

Problem: chain complete does not work when 'cot' includes fuzzy
and 'completefuzzycollect' collects wrong next word.
(Konfekt)
Solution: compl_startpos is not set correctly, remove next word check
in search_for_fuzzy_match (glepnir).

fixes #17131
fixes #16942
closes: #17136

Signed-off-by: glepnir <gleph...@gmail.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/insexpand.c b/src/insexpand.c
index 8673e7455..233586277 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -6101,7 +6101,6 @@ ins_compl_start(void)
if (line_invalid)
line = ml_get(curwin->w_cursor.lnum);

- int in_fuzzy = get_cot_flags() & COT_FUZZY;
if (compl_status_adding())
{
edit_submode_pre = (char_u *)_(" Adding");
@@ -6119,7 +6118,7 @@ ins_compl_start(void)
compl_col = curwin->w_cursor.col;
compl_lnum = curwin->w_cursor.lnum;
}
- else if (ctrl_x_mode_normal() && in_fuzzy)
+ else if (ctrl_x_mode_normal() && cfc_has_mode())
{
compl_startpos = curwin->w_cursor;
compl_cont_status &= CONT_S_IPOS;
diff --git a/src/search.c b/src/search.c
index abd74416d..68b2e727b 100644
--- a/src/search.c
+++ b/src/search.c
@@ -5370,30 +5370,6 @@ search_for_fuzzy_match(
len, &current_pos, score);
if (found_new_match)
{
- if (ctrl_x_mode_normal())
- {
- if (STRNCMP(*ptr, pattern, *len) == 0 && pattern[*len] == NUL)
- {
- char_u *next_word_end = find_word_start(*ptr + *len);
- if (*next_word_end != NUL && *next_word_end != NL)
- {
- // Find end of the word.
- if (has_mbyte)
- while (*next_word_end != NUL)
- {
- int l = (*mb_ptr2len)(next_word_end);
-
- if (l < 2 && !vim_iswordc(*next_word_end))
- break;
- next_word_end += l;
- }
- else
- next_word_end = find_word_end(next_word_end);
- }
-
- *len = next_word_end - *ptr;
- }
- }
*pos = current_pos;
break;
}
diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim
index 2b14bfa76..916ad19fb 100644
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -3480,6 +3480,14 @@ func Test_complete_opt_fuzzy()
call feedkeys("Sb\<C-X>\<C-P>\<C-N>\<C-Y>\<ESC>", 'tx')
call assert_equal('b', getline('.'))

+ " chain completion
+ call feedkeys("Slore spum\<CR>lor\<C-X>\<C-P>\<C-X>\<C-P>\<ESC>", 'tx')
+ call assert_equal('lore spum', getline('.'))
+
+ " issue #15412
+ call feedkeys("Salpha bravio charlie\<CR>alpha\<C-X>\<C-N>\<C-X>\<C-N>\<C-X>\<C-N>\<ESC>", 'tx')
+ call assert_equal('alpha bravio charlie', getline('.'))
+
" clean up
set omnifunc=
bw!
@@ -3565,34 +3573,6 @@ func Test_complete_fuzzy_collect()
call feedkeys("Su\<C-X>\<C-L>\<C-P>\<Esc>0", 'tx!')
call assert_equal('no one can save me but you', getline('.'))

- " issue #15412
- call setline(1, ['alpha bravio charlie'])
- call feedkeys("Salpha\<C-X>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('alpha bravio', getline('.'))
- call feedkeys("Salp\<C-X>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('alpha', getline('.'))
- call feedkeys("A\<C-X>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('alpha bravio', getline('.'))
- call feedkeys("A\<C-X>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('alpha bravio charlie', getline('.'))
-
- set complete-=i
- call feedkeys("Salp\<C-X>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('alpha', getline('.'))
- call feedkeys("A\<C-X>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('alpha bravio', getline('.'))
- call feedkeys("A\<C-X>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('alpha bravio charlie', getline('.'))
-
- call setline(1, ['alpha bravio charlie', 'alpha another'])
- call feedkeys("Salpha\<C-X>\<C-N>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('alpha another', getline('.'))
- call setline(1, ['你好 我好', '你好 他好'])
- call feedkeys("S你好\<C-X>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('你好 我好', getline('.'))
- call feedkeys("S你好\<C-X>\<C-N>\<C-N>\<Esc>0", 'tx!')
- call assert_equal('你好 他好', getline('.'))
-
" issue #15526
set completeopt=menuone,menu,noselect
call setline(1, ['Text', 'ToText', ''])
@@ -3618,6 +3598,11 @@ func Test_complete_fuzzy_collect()
call feedkeys("Gofuzzy\<C-X>\<C-N>\<C-N>\<C-N>\<C-Y>\<Esc>0", 'tx!')
call assert_equal('completefuzzycollect', getline('.'))

+ execute('%d _')
+ call setline(1, ['fuzzy', 'fuzzy foo', "fuzzy bar", 'fuzzycollect'])
+ call feedkeys("Gofuzzy\<C-X>\<C-N>\<C-N>\<C-N>\<C-Y>\<Esc>0", 'tx!')
+ call assert_equal('fuzzycollect', getline('.'))
+
bw!
bw!
set dict&
diff --git a/src/version.c b/src/version.c
index 5ced0fefd..9a1926004 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1315,
/**/
1314,
/**/
Reply all
Reply to author
Forward
0 new messages