feat(complete): CompleteDone reason "cancel", "discard" #32600

Problem: there is no way to distinguish between user's explicit
  completion stop/cancel and other automated reasons.

Solution: update "cancel" reason to be set only on explicit CTRL-e, and
  set intentionally vague "discard" otherwise.
This commit is contained in:
Evgeni Chasnovski
2025-02-24 00:08:26 +02:00
committed by GitHub
parent 07c5f41da3
commit 268a3de0a7
3 changed files with 23 additions and 14 deletions

View File

@ -470,11 +470,11 @@ CompleteDone After Insert mode completion is done. Either
reason Reason for completion being
done. Can be one of:
- "accept": completion was
accepted using |complete_CTRL-Y|.
- "cancel": completion was cancelled
using |complete_CTRL-E|, pressing
a non-keyword character, or
triggering a new completion.
accepted by |complete_CTRL-Y|.
- "cancel": completion was
stopped by |complete_CTRL-E.
- "discard": completion was
ended for other reason.
*CursorHold*
CursorHold When the user doesn't press a key for the time

View File

@ -581,7 +581,8 @@ static void do_autocmd_completedone(int c, int mode, char *word)
tv_dict_add_str(v_event, S_LEN("complete_word"), word != NULL ? word : "");
tv_dict_add_str(v_event, S_LEN("complete_type"), mode_str != NULL ? mode_str : "");
tv_dict_add_str(v_event, S_LEN("reason"), (c == Ctrl_Y ? "accept" : "cancel"));
tv_dict_add_str(v_event, S_LEN("reason"),
(c == Ctrl_Y ? "accept" : (c == Ctrl_E ? "cancel" : "discard")));
tv_dict_set_keys_readonly(v_event);
ins_apply_autocmds(EVENT_COMPLETEDONE);

View File

@ -23,18 +23,26 @@ describe('CompleteDone', function()
feed('<C-y>')
eq('accept', eval('g:donereason'))
end)
describe('cancel', function()
it('on <C-e>', function()
feed('<C-e>')
eq('cancel', eval('g:donereason'))
end)
it('cancel', function()
feed('<C-e>')
eq('cancel', eval('g:donereason'))
end)
describe('discard', function()
it('on non-keyword character', function()
feed('<Esc>')
eq('cancel', eval('g:donereason'))
feed('<Space>')
eq('discard', eval('g:donereason'))
end)
it('on mode change', function()
feed('<Esc>')
eq('discard', eval('g:donereason'))
end)
it('when overridden by another complete()', function()
call('complete', call('col', '.'), { 'bar', 'baz' })
eq('cancel', eval('g:donereason'))
eq('discard', eval('g:donereason'))
end)
end)
end)