diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2021-12-09 21:10:58 +0100 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2021-12-09 21:10:58 +0100 |
commit | 51822f065590154561a59435ca920207fd39bdda (patch) | |
tree | 68b23bad187daef4b6a01628747d87c0d1f60526 /src/nvim/state.c | |
parent | 2ec0e0a868ba20373ef4cd2d2540db7e829ddc56 (diff) | |
download | rneovim-51822f065590154561a59435ca920207fd39bdda.tar.gz rneovim-51822f065590154561a59435ca920207fd39bdda.tar.bz2 rneovim-51822f065590154561a59435ca920207fd39bdda.zip |
refactor(misc1): move out autocmd related functions
Diffstat (limited to 'src/nvim/state.c')
-rw-r--r-- | src/nvim/state.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/nvim/state.c b/src/nvim/state.c index 71db25664f..68bc76660d 100644 --- a/src/nvim/state.c +++ b/src/nvim/state.c @@ -4,7 +4,9 @@ #include <assert.h> #include "nvim/ascii.h" +#include "nvim/autocmd.h" #include "nvim/edit.h" +#include "nvim/eval.h" #include "nvim/ex_docmd.h" #include "nvim/getchar.h" #include "nvim/lib/kvec.h" @@ -202,3 +204,33 @@ char *get_mode(void) return buf; } + +/// Fires a ModeChanged autocmd. +void trigger_modechanged(void) +{ + if (!has_event(EVENT_MODECHANGED)) { + return; + } + + char *mode = get_mode(); + if (STRCMP(mode, last_mode) == 0) { + xfree(mode); + return; + } + + 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("new_mode"), mode); + tv_dict_add_str(v_event, S_LEN("old_mode"), last_mode); + + char_u *pat_pre = concat_str((char_u *)last_mode, (char_u *)":"); + char_u *pat = concat_str(pat_pre, (char_u *)mode); + xfree(pat_pre); + + apply_autocmds(EVENT_MODECHANGED, pat, NULL, false, curbuf); + xfree(last_mode); + last_mode = mode; + + xfree(pat); + restore_v_event(v_event, &save_v_event); +} |