diff --git a/src/nvim/context.c b/src/nvim/context.c index 24855b5a3b..6575f79000 100644 --- a/src/nvim/context.c +++ b/src/nvim/context.c @@ -312,6 +312,7 @@ static void ctx_localdirs_restore(CtxSwitch *cs, win_T *cwp, tabpage_T *tp, bool /// ('autochdir', win/tab-local directories) can be undone. /// - kCtxKeepDirs: also copies of the target context's dir scopes (w/b/tp-local, global). static void ctx_dirs_save(CtxSwitch *cs, win_T *wp, tabpage_T *tp, buf_T *buf) + FUNC_ATTR_NONNULL_ARG(1, 2, 3) { if (!(cs->cs_flags & (kCtxKeepCwd | kCtxKeepDirs))) { return; @@ -332,8 +333,8 @@ static void ctx_dirs_save(CtxSwitch *cs, win_T *wp, tabpage_T *tp, buf_T *buf) char cwd[MAXPATHL]; if ((cs->cs_flags & kCtxKeepDirs) || (curwin != wp - && (curwin->w_localdir != NULL || (wp != NULL && wp->w_localdir != NULL) - || curbuf->b_localdir != NULL || (wp != NULL && wp->w_buffer->b_localdir != NULL) + && (curwin->w_localdir != NULL || wp->w_localdir != NULL + || curbuf->b_localdir != NULL || wp->w_buffer->b_localdir != NULL || (curtab != tp && (curtab->tp_localdir != NULL || tp->tp_localdir != NULL)) || p_acd))) { if (os_dirname(cwd, MAXPATHL) == OK) { @@ -350,7 +351,7 @@ static void ctx_dirs_save(CtxSwitch *cs, win_T *wp, tabpage_T *tp, buf_T *buf) do_autochdir(); char autocwd[MAXPATHL]; if (os_dirname(autocwd, MAXPATHL) == OK) { - cs->cs_apply_acd = strcmp(cwd, autocwd) == 0; + cs->cs_apply_acd = strcmp(cs->cs_cwd, autocwd) == 0; } } } @@ -552,7 +553,7 @@ bool ctx_switch(CtxSwitch *cs, win_T *wp, tabpage_T *tp, buf_T *buf, CtxSwitchFl } // The CWD-state snapshot is only for a real window target; hidden-buffer target is handled by the // ctx_win machinery (ctx_win_prep). - if (buf == NULL || wp != NULL) { + if (wp != NULL) { ctx_dirs_save(cs, wp, tp == NULL ? curtab : tp, buf); } diff --git a/test/functional/terminal/ex_terminal_spec.lua b/test/functional/terminal/ex_terminal_spec.lua index 95e2079aef..c9f8fc8859 100644 --- a/test/functional/terminal/ex_terminal_spec.lua +++ b/test/functional/terminal/ex_terminal_spec.lua @@ -268,13 +268,13 @@ local function test_terminal_with_fake_shell(backslash) end) it('spawns in CWD effective at time of invocation', function() - command('terminal') + -- Run "echo" so the default TermClose handler does not auto-delete an exitcode=0 shell. + command('terminal echo') local dir = fn.bufname():match('^term://(.-)//') - command('bcd ..') -- :terminal should use this CWD. - command('terminal') - local parent = fn.bufname():match('^term://(.-)//') - neq(dir, parent) - eq(fn.fnamemodify(dir, ':h'), parent) + local parentdir = fn.fnamemodify(fn.getcwd(), ':h') -- Absolute, so 'cdpath' cannot interfere. + command(('bcd %s'):format(fn.fnameescape(parentdir))) -- :terminal should use this CWD. + command('terminal echo') + eq(fn.fnamemodify(dir, ':h'), fn.bufname():match('^term://(.-)//')) end) it('allows quotes and slashes', function()