aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/misc1.c
diff options
context:
space:
mode:
authorMagnus Groß <magnus.gross@rwth-aachen.de>2021-09-29 16:36:48 +0200
committerMagnus Groß <magnus.gross@rwth-aachen.de>2021-11-18 11:23:18 +0100
commit69bd1e4e36fa3e3f604740c92b15b13141520822 (patch)
treebcff79c6cef4d64707ce1819d18c466872304bcc /src/nvim/misc1.c
parent36538417f027758ee50faf50c5e4dcc6cb73431d (diff)
downloadrneovim-69bd1e4e36fa3e3f604740c92b15b13141520822.tar.gz
rneovim-69bd1e4e36fa3e3f604740c92b15b13141520822.tar.bz2
rneovim-69bd1e4e36fa3e3f604740c92b15b13141520822.zip
vim-patch:8.2.3430: no generic way to trigger an autocommand on mode change
Problem: No generic way to trigger an autocommand on mode change. Solution: Add the ModeChanged autocommand event. (Magnus Gross, closes vim/vim#8856) https://github.com/vim/vim/commit/f1e8876fa2359b572d262772747405d3616db670 N/A patches for version.c: vim-patch:8.2.3434: function prototype for trigger_modechanged() is incomplete Problem: Function prototype for trigger_modechanged() is incomplete. Solution: Add "void". https://github.com/vim/vim/commit/28e591dd5080bbcd0f468f9d9597cedb716e28c9 Fixes #4399. Fixes #7416.
Diffstat (limited to 'src/nvim/misc1.c')
-rw-r--r--src/nvim/misc1.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c
index 5ecd4ca431..4c495ee9db 100644
--- a/src/nvim/misc1.c
+++ b/src/nvim/misc1.c
@@ -1059,3 +1059,32 @@ void add_time(char_u *buf, size_t buflen, time_t tt)
seconds);
}
}
+
+/// Fires a ModeChanged autocmd.
+void trigger_modechanged(void)
+{
+ if (!has_event(EVENT_MODECHANGED)) {
+ return;
+ }
+
+ dict_T *v_event = get_vim_var_dict(VV_EVENT);
+
+ char *mode = get_mode();
+ if (last_mode == NULL) {
+ last_mode = (char *)vim_strsave((char_u *)"n");
+ }
+ 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);
+ tv_dict_free_contents(v_event);
+ hash_init(&v_event->dv_hashtab);
+}