patch 9.1.1185: endless loop with completefuzzycollect and no match found Commit: https://github.com/vim/vim/commit/dd42b05f8a37df03a9b77a16a47c08ab33af2b1f Author: glepnir <glephun...@gmail.com> Date: Sat Mar 8 16:52:55 2025 +0100
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 <glephun...@gmail.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/insexpand.c b/src/insexpand.c index f77004131..d8bb0814d 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 8d9616426..2d1d12cd1 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 67082a731..654b8968b 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 345e365dd..e63b13334 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\<C-N>\<C-N>\<ESC>" 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& " file diff --git a/src/version.c b/src/version.c index 8223d0c2b..1bfcbcbd0 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, /**/ -- -- 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/E1tqwaq-00G0ZF-Lm%40256bit.org.