patch 9.1.1197: process_next_cpt_value() uses wrong condition Commit: https://github.com/vim/vim/commit/53b14578e03f93a53fd6eb21c00caf96484742ed Author: glepnir <glephun...@gmail.com> Date: Wed Mar 12 21:28:39 2025 +0100
patch 9.1.1197: process_next_cpt_value() uses wrong condition Problem: process_next_cpt_value() uses wrong condition Solution: use cfc_has_mode() instead and remove redundant else if branch (glepnir) closes: #16833 Signed-off-by: glepnir <glephun...@gmail.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 588daf643..c2ad86e0e 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.1. Last change: 2025 Mar 07 +*options.txt* For Vim version 9.1. Last change: 2025 Mar 12 VIM REFERENCE MANUAL by Bram Moolenaar @@ -2107,14 +2107,23 @@ A jump table for the options with a short description can be found at |Q_op|. *'completefuzzycollect'* *'cfc'* 'completefuzzycollect' 'cfc' string (default: empty) global - This option enables fuzzy collection for (only some) specific - |ins-completion| modes, adjusting how items are gathered for fuzzy - matching based on input. - The option can contain the following values (separated by commas), - each enabling fuzzy collection for a specific completion mode: - files file names - keyword keyword completion in 'complete' and current file - whole_line whole lines + A comma-separated list of option enables fuzzy collection for specific + |ins-completion| modes, affecting how items are gathered during + completion. When set, fuzzy matching is used to find completion + candidates instead of the standard prefix-based matching. This option + can contain the following values are: + + keyword keywords in the current file |i_CTRL-X_CTRL-N| + keywords with the ".", "w", "b", "u", "U" and + "k{dict}" flags in 'complete'. |i_CTRL-N| |i_CTRL-P| + + files file names |i_CTRL-X_CTRL-F| + + whole_line whole lines |i_CTRL-X_CTRL-L| + + When used with 'completeopt' "longest" option, fuzzy collection can + identify the longest common string among the best fuzzy matches and + automatically insert it. *'completeitemalign'* *'cia'* 'completeitemalign' 'cia' string (default: "abbr,kind,menu") diff --git a/src/insexpand.c b/src/insexpand.c index d8bb0814d..35d20d01d 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -3671,7 +3671,7 @@ process_next_cpt_value( ins_compl_next_state_T *st, int *compl_type_arg, pos_T *start_match_pos, - int in_fuzzy) + int fuzzy_collect) { int compl_type = -1; int status = INS_COMPL_CPT_OK; @@ -3687,7 +3687,7 @@ process_next_cpt_value( st->first_match_pos = *start_match_pos; // Move the cursor back one character so that ^N can match the // word immediately after the cursor. - if (ctrl_x_mode_normal() && (!in_fuzzy && dec(&st->first_match_pos) < 0)) + if (ctrl_x_mode_normal() && (!fuzzy_collect && dec(&st->first_match_pos) < 0)) { // Move the cursor to after the last character in the // buffer, so that word at start of buffer is found @@ -4487,7 +4487,6 @@ ins_compl_get_exp(pos_T *ini) int i; int found_new_match; int type = ctrl_x_mode; - int in_fuzzy = (get_cot_flags() & COT_FUZZY) != 0; if (!compl_started) { @@ -4528,7 +4527,7 @@ ins_compl_get_exp(pos_T *ini) if ((ctrl_x_mode_normal() || ctrl_x_mode_line_or_eval()) && (!compl_started || st.found_all)) { - int status = process_next_cpt_value(&st, &type, ini, in_fuzzy); + int status = process_next_cpt_value(&st, &type, ini, cfc_has_mode()); if (status == INS_COMPL_CPT_END) break; diff --git a/src/search.c b/src/search.c index 654b8968b..064ed3e1e 100644 --- a/src/search.c +++ b/src/search.c @@ -5229,7 +5229,7 @@ fuzzy_match_str_with_pos(char_u *str UNUSED, char_u *pat UNUSED) * - `*len` is set to the length of the matched word. * - `*score` contains the match score. * - * If no match is found, `*ptr` is updated to to the end of the line. + * If no match is found, `*ptr` is updated to the end of the line. */ int fuzzy_match_str_in_line( @@ -5313,10 +5313,7 @@ search_for_fuzzy_match( pos_T circly_end; int found_new_match = FALSE; int looped_around = FALSE; - - int whole_line = ctrl_x_mode_whole_line(); - if (whole_line) - current_pos.lnum += dir; + int whole_line = ctrl_x_mode_whole_line(); if (buf == curbuf) circly_end = *start_pos; @@ -5327,6 +5324,9 @@ search_for_fuzzy_match( circly_end.coladd = 0; } + if (whole_line && start_pos->lnum != pos->lnum) + current_pos.lnum += dir; + do { // Check if looped around and back to start position @@ -5338,13 +5338,15 @@ search_for_fuzzy_match( { // Get the current line buffer *ptr = ml_get_buf(buf, current_pos.lnum, FALSE); + if (!whole_line) + *ptr += current_pos.col; + // If ptr is end of line is reached, move to next line // or previous line based on direction if (*ptr != NULL && **ptr != NUL) { if (!whole_line) { - *ptr += current_pos.col; // Try to find a fuzzy match in the current line starting // from current position found_new_match = fuzzy_match_str_in_line(ptr, pattern, @@ -5371,8 +5373,6 @@ search_for_fuzzy_match( else next_word_end = find_word_end(next_word_end); } - else if (looped_around) - found_new_match = FALSE; *len = next_word_end - *ptr; current_pos.col = *len; diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index e63b13334..e2a69f383 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -2949,6 +2949,12 @@ func Test_complete_fuzzy_collect() call feedkeys("STe\<C-X>\<C-N>x\<CR>\<Esc>0", 'tx!') call assert_equal('Tex', getline(line('.') - 1)) + call setline(1, ['fuzzy', 'fuzzycollect', 'completefuzzycollect']) + call feedkeys("Gofuzzy\<C-X>\<C-N>\<C-N>\<C-N>\<CR>\<Esc>0", 'tx!') + call assert_equal('fuzzycollect', getline(line('.') - 1)) + call feedkeys("Gofuzzy\<C-X>\<C-N>\<C-N>\<C-N>\<C-N>\<CR>\<Esc>0", 'tx!') + call assert_equal('completefuzzycollect', getline(line('.') - 1)) + bw! bw! set completeopt& cfc& cpt& diff --git a/src/version.c b/src/version.c index 474d2c7e1..65332f5e9 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 */ +/**/ + 1197, /**/ 1196, /**/ -- -- 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/E1tsSwp-006hvB-09%40256bit.org.