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:
parent
af05694900
commit
dd42b05f8a
@ -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;
|
||||||
|
@ -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 : */
|
||||||
|
10
src/search.c
10
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.
|
* - `*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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user