aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Hinz <mh.codebro@gmail.com>2017-01-11 00:51:31 +0100
committerMarco Hinz <mh.codebro@gmail.com>2017-01-13 15:29:00 +0100
commitbd8025727cc1ca4389af8fc690b467e2e25a3903 (patch)
tree33825f5fd609d9032d6c849d1669ada708c1f88c
parentf68663542037aaa4ae954aacae7adf2e88b151d5 (diff)
downloadrneovim-bd8025727cc1ca4389af8fc690b467e2e25a3903.tar.gz
rneovim-bd8025727cc1ca4389af8fc690b467e2e25a3903.tar.bz2
rneovim-bd8025727cc1ca4389af8fc690b467e2e25a3903.zip
New event: DirChanged
-rw-r--r--src/nvim/auevents.lua2
-rw-r--r--src/nvim/ex_docmd.c37
2 files changed, 35 insertions, 4 deletions
diff --git a/src/nvim/auevents.lua b/src/nvim/auevents.lua
index 8d891effae..6c62748aae 100644
--- a/src/nvim/auevents.lua
+++ b/src/nvim/auevents.lua
@@ -28,6 +28,7 @@ return {
'CursorHoldI', -- idem, in Insert mode
'CursorMoved', -- cursor was moved
'CursorMovedI', -- cursor was moved in Insert mode
+ 'DirChanged', -- directory changed
'EncodingChanged', -- after changing the 'encoding' option
'FileAppendCmd', -- append to a file using command
'FileAppendPost', -- after appending to a file
@@ -101,6 +102,7 @@ return {
-- List of neovim-specific events or aliases for the purpose of generating
-- syntax file
neovim_specific = {
+ DirChanged=true,
TabClosed=true,
TabNew=true,
TabNewEntered=true,
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 5ff79bcfef..e5c05a2498 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -6949,6 +6949,35 @@ void free_cd_dir(void)
#endif
+static void apply_autocmd_dirchanged(char_u *new_dir, CdScope scope)
+{
+ dict_T *dict = get_vim_var_dict(VV_EVENT);
+ char buf[8];
+
+ switch (scope) {
+ case kCdScopeGlobal:
+ snprintf(buf, sizeof(buf), "global");
+ break;
+ case kCdScopeTab:
+ snprintf(buf, sizeof(buf), "tab");
+ break;
+ case kCdScopeWindow:
+ snprintf(buf, sizeof(buf), "window");
+ break;
+ case kCdScopeInvalid:
+ // Should never happen.
+ assert(false);
+ }
+
+ dict_add_nr_str(dict, "scope", 0L, (char_u *)buf);
+ dict_add_nr_str(dict, "cwd", 0L, new_dir);
+ dict_set_keys_readonly(dict);
+
+ apply_autocmds(EVENT_DIRCHANGED, NULL, new_dir, false, NULL);
+
+ dict_clear(dict);
+}
+
/// Deal with the side effects of changing the current directory.
///
/// @param scope Scope of the function call (global, tab or window).
@@ -6972,6 +7001,8 @@ void post_chdir(CdScope scope)
}
}
+ apply_autocmd_dirchanged(new_dir, scope);
+
switch (scope) {
case kCdScopeGlobal:
// We are now in the global directory, no need to remember its name.
@@ -6998,8 +7029,6 @@ void post_chdir(CdScope scope)
shorten_fnames(TRUE);
}
-
-
/// `:cd`, `:tcd`, `:lcd`, `:chdir`, `:tchdir` and `:lchdir`.
void ex_cd(exarg_T *eap)
{
@@ -7061,8 +7090,8 @@ void ex_cd(exarg_T *eap)
post_chdir(scope);
- /* Echo the new current directory if the command was typed. */
- if (KeyTyped || p_verbose >= 5)
+ // Echo the new current directory if the command was typed.
+ if (KeyTyped || p_verbose >= 5) {
ex_pwd(eap);
}
xfree(tofree);