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

patch 9.1.1185: endless loop with completefuzzycollect and no match found

Problem:  endless loop with completefuzzycollect and no match found
Solution: move pointer to line end and break loop

closes: #16820

Signed-off-by: glepnir <glephunter@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
glepnir 2025-03-08 16:52:55 +01:00 committed by Christian Brabandt
parent af05694900
commit dd42b05f8a
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
5 changed files with 17 additions and 7 deletions

View File

@ -217,7 +217,6 @@ static int ins_compl_add(char_u *str, int len, char_u *fname, char_u **cptext, t
static void ins_compl_longest_match(compl_T *match); static void ins_compl_longest_match(compl_T *match);
static void ins_compl_del_pum(void); static void ins_compl_del_pum(void);
static void ins_compl_files(int count, char_u **files, int thesaurus, int flags, regmatch_T *regmatch, char_u *buf, int *dir); static void ins_compl_files(int count, char_u **files, int thesaurus, int flags, regmatch_T *regmatch, char_u *buf, int *dir);
static char_u *find_line_end(char_u *ptr);
static void ins_compl_free(void); static void ins_compl_free(void);
static int ins_compl_need_restart(void); static int ins_compl_need_restart(void);
static void ins_compl_new_leader(void); static void ins_compl_new_leader(void);
@ -1870,8 +1869,6 @@ ins_compl_files(
&& score == compl_first_match->cp_next->cp_score) && score == compl_first_match->cp_next->cp_score)
compl_num_bests++; compl_num_bests++;
} }
else if (find_word_end(ptr) == line_end)
break;
} }
} }
line_breakcheck(); line_breakcheck();
@ -1927,7 +1924,7 @@ find_word_end(char_u *ptr)
* Find the end of the line, omitting CR and NL at the end. * Find the end of the line, omitting CR and NL at the end.
* Returns a pointer to just after the line. * Returns a pointer to just after the line.
*/ */
static char_u * char_u *
find_line_end(char_u *ptr) find_line_end(char_u *ptr)
{ {
char_u *s; char_u *s;

View File

@ -65,4 +65,6 @@ int ins_compl_col_range_attr(linenr_T lnum, int col);
void free_insexpand_stuff(void); void free_insexpand_stuff(void);
int ins_compl_preinsert_effect(void); int ins_compl_preinsert_effect(void);
int ins_compl_lnum_in_range(linenr_T lnum); int ins_compl_lnum_in_range(linenr_T lnum);
char_u *find_line_end(char_u *ptr);
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@ -5229,8 +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 point beyond the last word * If no match is found, `*ptr` is updated to to the end of the line.
* or to the end of the line.
*/ */
int int
fuzzy_match_str_in_line( fuzzy_match_str_in_line(
@ -5246,11 +5245,13 @@ fuzzy_match_str_in_line(
char_u *start = NULL; char_u *start = NULL;
int found = FALSE; int found = FALSE;
char save_end; char save_end;
char_u *line_end = NULL;
if (str == NULL || pat == NULL) if (str == NULL || pat == NULL)
return found; return found;
line_end = find_line_end(str);
while (*str != NUL) while (str < line_end)
{ {
// Skip non-word characters // Skip non-word characters
start = find_word_start(str); start = find_word_start(str);
@ -5283,6 +5284,9 @@ fuzzy_match_str_in_line(
MB_PTR_ADV(str); MB_PTR_ADV(str);
} }
if (!found)
*ptr = line_end;
return found; return found;
} }

View File

@ -3005,6 +3005,11 @@ func Test_cfc_with_longest()
call writefile([' auto int enum register', 'why'], 'test_case4.txt', 'D') call writefile([' auto int enum register', 'why'], 'test_case4.txt', 'D')
exe "normal ggdGSe\<C-N>\<C-N>\<ESC>" exe "normal ggdGSe\<C-N>\<C-N>\<ESC>"
call assert_equal("enum", getline('.')) call assert_equal("enum", getline('.'))
set complete=ktest_case5.txt
call writefile(['hello friends', 'go', 'hero'], 'test_case5.txt', 'D')
exe "normal ggdGSh\<C-N>\<C-N>\<ESC>"
call assert_equal("hero", getline('.'))
set complete& set complete&
" file " file

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 */
/**/
1185,
/**/ /**/
1184, 1184,
/**/ /**/