diff options
author | Famiu Haque <famiuhaque@protonmail.com> | 2024-05-24 15:57:46 +0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-24 11:57:46 +0200 |
commit | a616272f568a9492580abfd22ab460457ecdbfa3 (patch) | |
tree | 54d644a7045c54ada00c64945fa2327330b14ccb /src | |
parent | d123202ae6ef3f046d5b6579c194dca82ddb8a8f (diff) | |
download | rneovim-a616272f568a9492580abfd22ab460457ecdbfa3.tar.gz rneovim-a616272f568a9492580abfd22ab460457ecdbfa3.tar.bz2 rneovim-a616272f568a9492580abfd22ab460457ecdbfa3.zip |
feat(complete): specify reason for CompleteDone
Problem: `CompleteDone` currently does not specify the reason for why completion was done, which is problematic for completion plugins as they cannot know whether the event was triggered due to the completion being canceled, accepted, or for some other reason.
Solution: Add a `reason` key to `v:event`, which is set by `CompleteDone` to indicate why completion ended.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/insexpand.c | 16 | ||||
-rw-r--r-- | src/nvim/vvars.lua | 1 |
2 files changed, 15 insertions, 2 deletions
diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c index cec1e4a9e3..b557b9802e 100644 --- a/src/nvim/insexpand.c +++ b/src/nvim/insexpand.c @@ -568,6 +568,18 @@ static bool is_first_match(const compl_T *const match) return match == compl_first_match; } +static void do_autocmd_completedone(int c) +{ + save_v_event_T save_v_event; + dict_T *v_event = get_v_event(&save_v_event); + + tv_dict_add_str(v_event, S_LEN("reason"), (c == Ctrl_Y ? "accept" : "cancel")); + tv_dict_set_keys_readonly(v_event); + + ins_apply_autocmds(EVENT_COMPLETEDONE); + restore_v_event(v_event, &save_v_event); +} + /// Check that character "c" is part of the item currently being /// completed. Used to decide whether to abandon complete mode when the menu /// is visible. @@ -2110,7 +2122,7 @@ static bool ins_compl_stop(const int c, const int prev_mode, bool retval) } // Trigger the CompleteDone event to give scripts a chance to act // upon the end of completion. - ins_apply_autocmds(EVENT_COMPLETEDONE); + do_autocmd_completedone(c); return retval; } @@ -2199,7 +2211,7 @@ bool ins_compl_prep(int c) } else if (ctrl_x_mode == CTRL_X_LOCAL_MSG) { // Trigger the CompleteDone event to give scripts a chance to act // upon the (possibly failed) completion. - ins_apply_autocmds(EVENT_COMPLETEDONE); + do_autocmd_completedone(c); } may_trigger_modechanged(); diff --git a/src/nvim/vvars.lua b/src/nvim/vvars.lua index 224edfaf6e..2f43f8b32b 100644 --- a/src/nvim/vvars.lua +++ b/src/nvim/vvars.lua @@ -215,6 +215,7 @@ M.vars = { changed_window Is |v:true| if the event fired while changing window (or tab) on |DirChanged|. status Job status or exit code, -1 means "unknown". |TermClose| + reason Reason for completion being done. |CompleteDone| ]=], }, exception = { |