patch 9.1.1610: completion: hang or E684 when 'tagfunc' calls complete()
Problem: completion: hang (after 9.1.1471) or E684 (after 9.1.1410)
when 'tagfunc' calls complete().
Solution: Check if complete() has been called immediately after getting
matches instead of in the next loop iteration (zeertzjq).
related: #1668
related: neovim/neovim#34416
related: neovim/neovim#35163
closes: #17929
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
bc51ec53d0
commit
982cda6976
@ -5515,11 +5515,6 @@ ins_compl_get_exp(pos_T *ini)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If complete() was called then compl_pattern has been reset. The
|
|
||||||
// following won't work then, bail out.
|
|
||||||
if (compl_pattern.string == NULL)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (compl_autocomplete && type == CTRL_X_FUNCTION)
|
if (compl_autocomplete && type == CTRL_X_FUNCTION)
|
||||||
// LSP servers may sporadically take >1s to respond (e.g., while
|
// LSP servers may sporadically take >1s to respond (e.g., while
|
||||||
// loading modules), but other sources might already have matches.
|
// loading modules), but other sources might already have matches.
|
||||||
@ -5532,6 +5527,11 @@ ins_compl_get_exp(pos_T *ini)
|
|||||||
// get the next set of completion matches
|
// get the next set of completion matches
|
||||||
found_new_match = get_next_completion_match(type, &st, &start_pos);
|
found_new_match = get_next_completion_match(type, &st, &start_pos);
|
||||||
|
|
||||||
|
// If complete() was called then compl_pattern has been reset. The
|
||||||
|
// following won't work then, bail out.
|
||||||
|
if (compl_pattern.string == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
if (may_advance_cpt_idx)
|
if (may_advance_cpt_idx)
|
||||||
{
|
{
|
||||||
if (!advance_cpt_sources_index_safe())
|
if (!advance_cpt_sources_index_safe())
|
||||||
|
|||||||
@ -3221,6 +3221,35 @@ func Test_tagfunc_wipes_out_buffer()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func s:TagfuncComplete(t,f,o)
|
||||||
|
call complete(1, ['ddd', 'eee', 'fff'])
|
||||||
|
return []
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" 'tagfunc' calling complete() should not cause hang or E684.
|
||||||
|
func Test_tagfunc_calls_complete()
|
||||||
|
new
|
||||||
|
call setline(1, ['aaa', 'bbb', 'ccc'])
|
||||||
|
setlocal tagfunc=s:TagfuncComplete
|
||||||
|
setlocal completeopt=menu,noselect
|
||||||
|
|
||||||
|
let v:errmsg = ''
|
||||||
|
|
||||||
|
" This used to hang.
|
||||||
|
setlocal complete=.,t
|
||||||
|
call feedkeys("Go\<C-N>\<C-E>\<Esc>", 'tx')
|
||||||
|
call assert_equal('', getline('.'))
|
||||||
|
call assert_equal('', v:errmsg)
|
||||||
|
|
||||||
|
" This used to cause E684.
|
||||||
|
setlocal complete=t,.
|
||||||
|
call feedkeys("cc\<C-N>\<C-E>\<Esc>", 'tx')
|
||||||
|
call assert_equal('', getline('.'))
|
||||||
|
call assert_equal('', v:errmsg)
|
||||||
|
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_ins_complete_popup_position()
|
func Test_ins_complete_popup_position()
|
||||||
CheckScreendump
|
CheckScreendump
|
||||||
|
|
||||||
|
|||||||
@ -719,6 +719,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 */
|
||||||
|
/**/
|
||||||
|
1610,
|
||||||
/**/
|
/**/
|
||||||
1609,
|
1609,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user