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>
diff --git a/src/insexpand.c b/src/insexpand.c
index f770041..d8bb081 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -217,7 +217,6 @@
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 @@
&& 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 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 8d96164..2d1d12c 100644
--- a/src/proto/insexpand.pro
+++ b/src/proto/insexpand.pro
@@ -65,4 +65,6 @@
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 67082a7..654b896 100644
--- a/src/search.c
+++ b/src/search.c
@@ -5229,8 +5229,7 @@
* - `*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 @@
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 @@
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 345e365..e63b133 100644
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -3005,6 +3005,11 @@
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 8223d0c..1bfcbcb 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1185,
+/**/
1184,
/**/
1183,