diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-02-11 12:44:47 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-02-11 12:55:58 +0800 |
commit | 059d36e326e31fc9bc6055d7c999f86d94fa9bd5 (patch) | |
tree | 53577f4456663a3315e0d485914c3a4d6c4e2f42 /src/nvim/window.c | |
parent | 851252f79ddaaca5456b287342cd36130c76ff38 (diff) | |
download | rneovim-059d36e326e31fc9bc6055d7c999f86d94fa9bd5.tar.gz rneovim-059d36e326e31fc9bc6055d7c999f86d94fa9bd5.tar.bz2 rneovim-059d36e326e31fc9bc6055d7c999f86d94fa9bd5.zip |
feat(events): add DirChangedPre
In Nvim, like DirChanged, this also triggers when switching windows.
This marks Vim patch 8.2.4335 as ported.
vim-patch:8.2.4335: no autocommand event triggered before changing directory
Problem: No autocommand event triggered before changing directory. (Ronnie
Magatti)
Solution: Add DirChangedPre. (closes vim/vim#9721)
https://github.com/vim/vim/commit/28e8f73ae2d90009fd62cd60f97c2643ba44de68
Diffstat (limited to 'src/nvim/window.c')
-rw-r--r-- | src/nvim/window.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/nvim/window.c b/src/nvim/window.c index 6996a93928..83495801e8 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -4645,20 +4645,29 @@ void fix_current_dir(void) globaldir = (char_u *)xstrdup(cwd); } } + bool dir_differs = pathcmp(new_dir, cwd, -1) != 0; + if (!p_acd && dir_differs) { + do_autocmd_dirchanged(new_dir, curwin->w_localdir ? kCdScopeWindow : kCdScopeTabpage, + kCdCauseWindow, true); + } if (os_chdir(new_dir) == 0) { - if (!p_acd && pathcmp(new_dir, cwd, -1) != 0) { - do_autocmd_dirchanged(new_dir, curwin->w_localdir - ? kCdScopeWindow : kCdScopeTabpage, kCdCauseWindow); + if (!p_acd && dir_differs) { + do_autocmd_dirchanged(new_dir, curwin->w_localdir ? kCdScopeWindow : kCdScopeTabpage, + kCdCauseWindow, false); } - last_chdir_reason = NULL; - shorten_fnames(true); } + last_chdir_reason = NULL; + shorten_fnames(true); } else if (globaldir != NULL) { // Window doesn't have a local directory and we are not in the global // directory: Change to the global directory. + bool dir_differs = pathcmp((char *)globaldir, cwd, -1) != 0; + if (!p_acd && dir_differs) { + do_autocmd_dirchanged((char *)globaldir, kCdScopeGlobal, kCdCauseWindow, true); + } if (os_chdir((char *)globaldir) == 0) { - if (!p_acd && pathcmp((char *)globaldir, cwd, -1) != 0) { - do_autocmd_dirchanged((char *)globaldir, kCdScopeGlobal, kCdCauseWindow); + if (!p_acd && dir_differs) { + do_autocmd_dirchanged((char *)globaldir, kCdScopeGlobal, kCdCauseWindow, false); } } XFREE_CLEAR(globaldir); |