From: glepnir Date: Sat, 8 Mar 2025 15:52:55 +0000 (+0100) Subject: patch 9.1.1185: endless loop with completefuzzycollect and no match found X-Git-Tag: v9.1.1185^0 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dd42b05f8a37df03a9b77a16a47c08ab33af2b1f;p=thirdparty%2Fvim.git 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 Signed-off-by: Christian Brabandt --- diff --git a/src/insexpand.c b/src/insexpand.c index f770041310..d8bb0814d3 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -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_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 char_u *find_line_end(char_u *ptr); static void ins_compl_free(void); static int ins_compl_need_restart(void); static void ins_compl_new_leader(void); @@ -1870,8 +1869,6 @@ ins_compl_files( && score == compl_first_match->cp_next->cp_score) compl_num_bests++; } - else if (find_word_end(ptr) == line_end) - break; } } 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. * Returns a pointer to just after the line. */ - static char_u * + char_u * find_line_end(char_u *ptr) { char_u *s; diff --git a/src/proto/insexpand.pro b/src/proto/insexpand.pro index 8d96164262..2d1d12cd1a 100644 --- a/src/proto/insexpand.pro +++ b/src/proto/insexpand.pro @@ -65,4 +65,6 @@ int ins_compl_col_range_attr(linenr_T lnum, int col); void free_insexpand_stuff(void); int ins_compl_preinsert_effect(void); int ins_compl_lnum_in_range(linenr_T lnum); +char_u *find_line_end(char_u *ptr); + /* vim: set ft=c : */ diff --git a/src/search.c b/src/search.c index 67082a731f..654b8968b5 100644 --- a/src/search.c +++ b/src/search.c @@ -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. * - `*score` contains the match score. * - * If no match is found, `*ptr` is updated to point beyond the last word - * or to the end of the line. + * If no match is found, `*ptr` is updated to to the end of the line. */ int fuzzy_match_str_in_line( @@ -5246,11 +5245,13 @@ fuzzy_match_str_in_line( char_u *start = NULL; int found = FALSE; char save_end; + char_u *line_end = NULL; if (str == NULL || pat == NULL) return found; + line_end = find_line_end(str); - while (*str != NUL) + while (str < line_end) { // Skip non-word characters start = find_word_start(str); @@ -5283,6 +5284,9 @@ fuzzy_match_str_in_line( MB_PTR_ADV(str); } + if (!found) + *ptr = line_end; + return found; } diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 345e365ddf..e63b13334a 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -3005,6 +3005,11 @@ func Test_cfc_with_longest() call writefile([' auto int enum register', 'why'], 'test_case4.txt', 'D') exe "normal ggdGSe\\\" call assert_equal("enum", getline('.')) + + set complete=ktest_case5.txt + call writefile(['hello friends', 'go', 'hero'], 'test_case5.txt', 'D') + exe "normal ggdGSh\\\" + call assert_equal("hero", getline('.')) set complete& " file diff --git a/src/version.c b/src/version.c index 8223d0c2bf..1bfcbcbd0b 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 */ +/**/ + 1185, /**/ 1184, /**/