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 | |
parent | 2ec0e0a868ba20373ef4cd2d2540db7e829ddc56 (diff) | |
download | rneovim-51822f065590154561a59435ca920207fd39bdda.tar.gz rneovim-51822f065590154561a59435ca920207fd39bdda.tar.bz2 rneovim-51822f065590154561a59435ca920207fd39bdda.zip |
refactor(misc1): move out autocmd related functions
-rw-r--r-- | src/nvim/buffer_defs.h | 6 | ||||
-rw-r--r-- | src/nvim/eval.c | 25 | ||||
-rw-r--r-- | src/nvim/eval.h | 7 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 1 | ||||
-rw-r--r-- | src/nvim/misc1.c | 55 | ||||
-rw-r--r-- | src/nvim/state.c | 32 |
6 files changed, 65 insertions, 61 deletions
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index e53b2d1dfa..49e527e98b 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -1116,12 +1116,6 @@ typedef struct { pos_T w_cursor_corr; // corrected cursor position } pos_save_T; -// Struct passed to get_v_event() and restore_v_event(). -typedef struct { - bool sve_did_save; - hashtab_T sve_hashtab; -} save_v_event_T; - /// Indices into vimmenu_T->strings[] and vimmenu_T->noremap[] for each mode /// \addtogroup MENU_INDEX /// @{ diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 85e81ee975..d45aa8194c 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -303,6 +303,31 @@ const list_T *eval_msgpack_type_lists[] = { [kMPExt] = NULL, }; +dict_T *get_v_event(save_v_event_T *sve) +{ + dict_T *v_event = get_vim_var_dict(VV_EVENT); + + if (v_event->dv_hashtab.ht_used > 0) { + // recursive use of v:event, save, make empty and restore later + sve->sve_did_save = true; + sve->sve_hashtab = v_event->dv_hashtab; + hash_init(&v_event->dv_hashtab); + } else { + sve->sve_did_save = false; + } + return v_event; +} + +void restore_v_event(dict_T *v_event, save_v_event_T *sve) +{ + tv_dict_free_contents(v_event); + if (sve->sve_did_save) { + v_event->dv_hashtab = sve->sve_hashtab; + } else { + hash_init(&v_event->dv_hashtab); + } +} + // Return "n1" divided by "n2", taking care of dividing by zero. varnumber_T num_divide(varnumber_T n1, varnumber_T n2) FUNC_ATTR_CONST FUNC_ATTR_WARN_UNUSED_RESULT diff --git a/src/nvim/eval.h b/src/nvim/eval.h index 3b3a68bd29..a9ec5d47a6 100644 --- a/src/nvim/eval.h +++ b/src/nvim/eval.h @@ -193,6 +193,13 @@ extern const list_T *eval_msgpack_type_lists[LAST_MSGPACK_TYPE + 1]; #undef LAST_MSGPACK_TYPE +// Struct passed to get_v_event() and restore_v_event(). +typedef struct { + bool sve_did_save; + hashtab_T sve_hashtab; +} save_v_event_T; + + /// trans_function_name() flags typedef enum { TFN_INT = 1, ///< May use internal function name diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 77cd50ecb7..4c040bff7f 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -68,6 +68,7 @@ #include "nvim/spell.h" #include "nvim/spellfile.h" #include "nvim/strings.h" +#include "nvim/state.h" #include "nvim/syntax.h" #include "nvim/tag.h" #include "nvim/terminal.h" diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c index dd753a2de6..bd2188ec15 100644 --- a/src/nvim/misc1.c +++ b/src/nvim/misc1.c @@ -1018,58 +1018,3 @@ void add_time(char_u *buf, size_t buflen, time_t tt) seconds); } } - -dict_T *get_v_event(save_v_event_T *sve) -{ - dict_T *v_event = get_vim_var_dict(VV_EVENT); - - if (v_event->dv_hashtab.ht_used > 0) { - // recursive use of v:event, save, make empty and restore later - sve->sve_did_save = true; - sve->sve_hashtab = v_event->dv_hashtab; - hash_init(&v_event->dv_hashtab); - } else { - sve->sve_did_save = false; - } - return v_event; -} - -void restore_v_event(dict_T *v_event, save_v_event_T *sve) -{ - tv_dict_free_contents(v_event); - if (sve->sve_did_save) { - v_event->dv_hashtab = sve->sve_hashtab; - } else { - hash_init(&v_event->dv_hashtab); - } -} - -/// 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); -} 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); +} |