patch 9.1.1315: completion: issue with fuzzy completion and 'completefuzzycollect'
Commit: https://github.com/vim/vim/commit/cfe502c5753cce2080ddabdfdcacb8e4b3092721 Author: glepnir <glephun...@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 <glephun...@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, ¤t_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, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1u5Tzv-008xgT-C5%40256bit.org.