0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

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 <glephunter@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
glepnir 2025-03-12 21:28:39 +01:00 committed by Christian Brabandt
parent 7546afbf52
commit 53b14578e0
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
5 changed files with 37 additions and 21 deletions

View File

@ -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 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'*
'completefuzzycollect' 'cfc' string (default: empty) 'completefuzzycollect' 'cfc' string (default: empty)
global global
This option enables fuzzy collection for (only some) specific A comma-separated list of option enables fuzzy collection for specific
|ins-completion| modes, adjusting how items are gathered for fuzzy |ins-completion| modes, affecting how items are gathered during
matching based on input. completion. When set, fuzzy matching is used to find completion
The option can contain the following values (separated by commas), candidates instead of the standard prefix-based matching. This option
each enabling fuzzy collection for a specific completion mode: can contain the following values are:
files file names
keyword keyword completion in 'complete' and current file keyword keywords in the current file |i_CTRL-X_CTRL-N|
whole_line whole lines 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'*
'completeitemalign' 'cia' string (default: "abbr,kind,menu") 'completeitemalign' 'cia' string (default: "abbr,kind,menu")

View File

@ -3671,7 +3671,7 @@ process_next_cpt_value(
ins_compl_next_state_T *st, ins_compl_next_state_T *st,
int *compl_type_arg, int *compl_type_arg,
pos_T *start_match_pos, pos_T *start_match_pos,
int in_fuzzy) int fuzzy_collect)
{ {
int compl_type = -1; int compl_type = -1;
int status = INS_COMPL_CPT_OK; int status = INS_COMPL_CPT_OK;
@ -3687,7 +3687,7 @@ process_next_cpt_value(
st->first_match_pos = *start_match_pos; st->first_match_pos = *start_match_pos;
// Move the cursor back one character so that ^N can match the // Move the cursor back one character so that ^N can match the
// word immediately after the cursor. // 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 // Move the cursor to after the last character in the
// buffer, so that word at start of buffer is found // buffer, so that word at start of buffer is found
@ -4487,7 +4487,6 @@ ins_compl_get_exp(pos_T *ini)
int i; int i;
int found_new_match; int found_new_match;
int type = ctrl_x_mode; int type = ctrl_x_mode;
int in_fuzzy = (get_cot_flags() & COT_FUZZY) != 0;
if (!compl_started) 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()) if ((ctrl_x_mode_normal() || ctrl_x_mode_line_or_eval())
&& (!compl_started || st.found_all)) && (!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) if (status == INS_COMPL_CPT_END)
break; break;

View File

@ -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. * - `*len` is set to the length of the matched word.
* - `*score` contains the match score. * - `*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 int
fuzzy_match_str_in_line( fuzzy_match_str_in_line(
@ -5313,10 +5313,7 @@ search_for_fuzzy_match(
pos_T circly_end; pos_T circly_end;
int found_new_match = FALSE; int found_new_match = FALSE;
int looped_around = FALSE; int looped_around = FALSE;
int whole_line = ctrl_x_mode_whole_line(); int whole_line = ctrl_x_mode_whole_line();
if (whole_line)
current_pos.lnum += dir;
if (buf == curbuf) if (buf == curbuf)
circly_end = *start_pos; circly_end = *start_pos;
@ -5327,6 +5324,9 @@ search_for_fuzzy_match(
circly_end.coladd = 0; circly_end.coladd = 0;
} }
if (whole_line && start_pos->lnum != pos->lnum)
current_pos.lnum += dir;
do { do {
// Check if looped around and back to start position // Check if looped around and back to start position
@ -5338,13 +5338,15 @@ search_for_fuzzy_match(
{ {
// Get the current line buffer // Get the current line buffer
*ptr = ml_get_buf(buf, current_pos.lnum, FALSE); *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 // If ptr is end of line is reached, move to next line
// or previous line based on direction // or previous line based on direction
if (*ptr != NULL && **ptr != NUL) if (*ptr != NULL && **ptr != NUL)
{ {
if (!whole_line) if (!whole_line)
{ {
*ptr += current_pos.col;
// Try to find a fuzzy match in the current line starting // Try to find a fuzzy match in the current line starting
// from current position // from current position
found_new_match = fuzzy_match_str_in_line(ptr, pattern, found_new_match = fuzzy_match_str_in_line(ptr, pattern,
@ -5371,8 +5373,6 @@ search_for_fuzzy_match(
else else
next_word_end = find_word_end(next_word_end); next_word_end = find_word_end(next_word_end);
} }
else if (looped_around)
found_new_match = FALSE;
*len = next_word_end - *ptr; *len = next_word_end - *ptr;
current_pos.col = *len; current_pos.col = *len;

View File

@ -2949,6 +2949,12 @@ func Test_complete_fuzzy_collect()
call feedkeys("STe\<C-X>\<C-N>x\<CR>\<Esc>0", 'tx!') call feedkeys("STe\<C-X>\<C-N>x\<CR>\<Esc>0", 'tx!')
call assert_equal('Tex', getline(line('.') - 1)) 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!
bw! bw!
set completeopt& cfc& cpt& set completeopt& cfc& cpt&

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1197,
/**/ /**/
1196, 1196,
/**/ /**/