mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 9.1.0605: internal error with fuzzy completion
Problem: internal error with fuzzy completion (techntools) Solution: only fuzzy complete the pattern after directory separator (glepnir) fixes: #15287 closes: #15291 Signed-off-by: glepnir <glephunter@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
parent
b14c325a5b
commit
0be03e14b9
@ -3537,11 +3537,41 @@ get_next_filename_completion(void)
|
|||||||
int in_fuzzy = ((get_cot_flags() & COT_FUZZY) != 0 && leader_len > 0);
|
int in_fuzzy = ((get_cot_flags() & COT_FUZZY) != 0 && leader_len > 0);
|
||||||
char_u **sorted_matches;
|
char_u **sorted_matches;
|
||||||
int *fuzzy_indices_data;
|
int *fuzzy_indices_data;
|
||||||
|
char_u *last_sep = NULL;
|
||||||
|
size_t path_with_wildcard_len;
|
||||||
|
char_u *path_with_wildcard;
|
||||||
|
|
||||||
if (in_fuzzy)
|
if (in_fuzzy)
|
||||||
{
|
{
|
||||||
|
last_sep = vim_strrchr(leader, PATHSEP);
|
||||||
|
if (last_sep == NULL)
|
||||||
|
{
|
||||||
|
// No path separator or separator is the last character,
|
||||||
|
// fuzzy match the whole leader
|
||||||
vim_free(compl_pattern);
|
vim_free(compl_pattern);
|
||||||
compl_pattern = vim_strsave((char_u *)"*");
|
compl_pattern = vim_strsave((char_u *)"*");
|
||||||
|
compl_patternlen = STRLEN(compl_pattern);
|
||||||
|
}
|
||||||
|
else if (*(last_sep + 1) == '\0')
|
||||||
|
in_fuzzy = FALSE;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Split leader into path and file parts
|
||||||
|
int path_len = last_sep - leader + 1;
|
||||||
|
path_with_wildcard_len = path_len + 2;
|
||||||
|
path_with_wildcard = alloc(path_with_wildcard_len);
|
||||||
|
if (path_with_wildcard != NULL)
|
||||||
|
{
|
||||||
|
vim_strncpy(path_with_wildcard, leader, path_len);
|
||||||
|
vim_strcat(path_with_wildcard, (char_u *)"*", path_with_wildcard_len);
|
||||||
|
vim_free(compl_pattern);
|
||||||
|
compl_pattern = path_with_wildcard;
|
||||||
|
compl_patternlen = STRLEN(compl_pattern);
|
||||||
|
|
||||||
|
// Move leader to the file part
|
||||||
|
leader = last_sep + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (expand_wildcards(1, &compl_pattern, &num_matches, &matches,
|
if (expand_wildcards(1, &compl_pattern, &num_matches, &matches,
|
||||||
|
@ -5222,7 +5222,6 @@ search_for_fuzzy_match(
|
|||||||
if (whole_line)
|
if (whole_line)
|
||||||
current_pos.lnum += dir;
|
current_pos.lnum += dir;
|
||||||
|
|
||||||
do {
|
|
||||||
if (buf == curbuf)
|
if (buf == curbuf)
|
||||||
circly_end = *start_pos;
|
circly_end = *start_pos;
|
||||||
else
|
else
|
||||||
@ -5232,6 +5231,8 @@ search_for_fuzzy_match(
|
|||||||
circly_end.coladd = 0;
|
circly_end.coladd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
// Check if looped around and back to start position
|
// Check if looped around and back to start position
|
||||||
if (looped_around && EQUAL_POS(current_pos, circly_end))
|
if (looped_around && EQUAL_POS(current_pos, circly_end))
|
||||||
break;
|
break;
|
||||||
@ -5255,6 +5256,8 @@ search_for_fuzzy_match(
|
|||||||
*pos = current_pos;
|
*pos = current_pos;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if (looped_around && current_pos.lnum == circly_end.lnum)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2625,6 +2625,10 @@ func Test_complete_fuzzy_match()
|
|||||||
call assert_equal('fobar', getline('.'))
|
call assert_equal('fobar', getline('.'))
|
||||||
call feedkeys("Sfob\<C-X>\<C-f>\<C-N>\<Esc>0", 'tx!')
|
call feedkeys("Sfob\<C-X>\<C-f>\<C-N>\<Esc>0", 'tx!')
|
||||||
call assert_equal('foobar', getline('.'))
|
call assert_equal('foobar', getline('.'))
|
||||||
|
call feedkeys("S../\<C-X>\<C-f>\<Esc>0", 'tx!')
|
||||||
|
call assert_match('../*', getline('.'))
|
||||||
|
call feedkeys("S../td\<C-X>\<C-f>\<Esc>0", 'tx!')
|
||||||
|
call assert_match('../testdir', getline('.'))
|
||||||
|
|
||||||
" can get completion from other buffer
|
" can get completion from other buffer
|
||||||
set completeopt=fuzzy,menu,menuone
|
set completeopt=fuzzy,menu,menuone
|
||||||
@ -2639,6 +2643,8 @@ func Test_complete_fuzzy_match()
|
|||||||
call assert_equal('Omnipotent', getline('.'))
|
call assert_equal('Omnipotent', getline('.'))
|
||||||
call feedkeys("Somp\<C-P>\<C-P>\<Esc>0", 'tx!')
|
call feedkeys("Somp\<C-P>\<C-P>\<Esc>0", 'tx!')
|
||||||
call assert_equal('Composite', getline('.'))
|
call assert_equal('Composite', getline('.'))
|
||||||
|
call feedkeys("S omp\<C-N>\<Esc>0", 'tx!')
|
||||||
|
call assert_equal(' completeness', getline('.'))
|
||||||
|
|
||||||
" fuzzy on whole line completion
|
" fuzzy on whole line completion
|
||||||
call setline(1, ["world is on fire", "no one can save me but you", 'user can execute', ''])
|
call setline(1, ["world is on fire", "no one can save me but you", 'user can execute', ''])
|
||||||
|
@ -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 */
|
||||||
|
/**/
|
||||||
|
605,
|
||||||
/**/
|
/**/
|
||||||
604,
|
604,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user