diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-04-08 06:25:22 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-08 06:25:22 +0800 |
commit | d188b929d46d74ca6a93e15c39cf06896a53fbf7 (patch) | |
tree | 66c0fb1f7576877c648b16cf0f7e98c734da44f7 /src | |
parent | d32cbef59551a1808caea2ddaeac323fdc18d6b6 (diff) | |
download | rneovim-d188b929d46d74ca6a93e15c39cf06896a53fbf7.tar.gz rneovim-d188b929d46d74ca6a93e15c39cf06896a53fbf7.tar.bz2 rneovim-d188b929d46d74ca6a93e15c39cf06896a53fbf7.zip |
vim-patch:9.1.0272: autocmd may change cwd after :tcd and :lcd (#28223)
Problem: Autocommand may change currect directory after :tcd and :lcd.
Solution: Also clear tp_localdir and w_localdir when using aucmd_win.
(zeertzjq)
closes: vim/vim#14435
https://github.com/vim/vim/commit/9d956ee8eab64a0d412b045305fde5bc03d95d4a
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/autocmd.c | 13 | ||||
-rw-r--r-- | src/nvim/autocmd_defs.h | 1 | ||||
-rw-r--r-- | src/nvim/window.c | 4 |
3 files changed, 14 insertions, 4 deletions
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index c2cc8bd9b8..e9db4abf9b 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -1325,9 +1325,11 @@ void aucmd_prepbuf(aco_save_T *aco, buf_T *buf) buf->b_nwindows++; win_init_empty(auc_win); // set cursor and topline to safe values - // Make sure w_localdir and globaldir are NULL to avoid a chdir() in - // win_enter_ext(). + // Make sure w_localdir, tp_localdir and globaldir are NULL to avoid a + // chdir() in win_enter_ext(). XFREE_CLEAR(auc_win->w_localdir); + aco->tp_localdir = curtab->tp_localdir; + curtab->tp_localdir = NULL; aco->globaldir = globaldir; globaldir = NULL; @@ -1427,6 +1429,13 @@ win_found: vars_clear(&awp->w_vars->dv_hashtab); // free all w: variables hash_init(&awp->w_vars->dv_hashtab); // re-use the hashtab + // If :lcd has been used in the autocommand window, correct current + // directory before restoring tp_localdir and globaldir. + if (awp->w_localdir != NULL) { + win_fix_current_dir(); + } + xfree(curtab->tp_localdir); + curtab->tp_localdir = aco->tp_localdir; xfree(globaldir); globaldir = aco->globaldir; diff --git a/src/nvim/autocmd_defs.h b/src/nvim/autocmd_defs.h index 6535f8a7ea..490782b209 100644 --- a/src/nvim/autocmd_defs.h +++ b/src/nvim/autocmd_defs.h @@ -19,6 +19,7 @@ typedef struct { handle_T new_curwin_handle; ///< ID of new curwin handle_T save_prevwin_handle; ///< ID of saved prevwin bufref_T new_curbuf; ///< new curbuf + char *tp_localdir; ///< saved value of tp_localdir char *globaldir; ///< saved value of globaldir bool save_VIsual_active; ///< saved VIsual_active int save_State; ///< saved State diff --git a/src/nvim/window.c b/src/nvim/window.c index 6d85e088b5..7389b1fe2f 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -4936,7 +4936,7 @@ static void win_enter_ext(win_T *const wp, const int flags) win_fix_cursor(get_real_state() & (MODE_NORMAL|MODE_CMDLINE|MODE_TERMINAL)); } - fix_current_dir(); + win_fix_current_dir(); entering_window(curwin); // Careful: autocommands may close the window and make "wp" invalid @@ -4989,7 +4989,7 @@ static void win_enter_ext(win_T *const wp, const int flags) } /// Used after making another window the current one: change directory if needed. -void fix_current_dir(void) +void win_fix_current_dir(void) { // New directory is either the local directory of the window, tab or NULL. char *new_dir = curwin->w_localdir ? curwin->w_localdir : curtab->tp_localdir; |