diff options
Diffstat (limited to 'src')
| -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); +} | 
