mirror of
https://github.com/neovim/neovim.git
synced 2026-08-20 22:31:11 +00:00
fix(:bcd): do not "inherit" buffer-local dir
Problem: Buffer-local CWD (:bcd) is "sticky", similar to window-local CWD (:lcd). But this contradicts one of its main benefits: per-buffer "project root" for LSP, OSC7. Other problems: - A buffer created with :edit/:enew/:new silently inherits b_localdir (and b_prevdir) from the previous buffer. - curbuf_reusable() refuses to recycle a scratch buffer that has `b_localdir`. - After :new/:vnew/:tabnew the CWD sticks to previous buffer's `b_localdir` even though the new curbuf has none, so :new is not equivalent to ":split | enew", and getcwd() disagrees with haslocaldir(). - Requires "which buffer spawned this buffer" semantics that no other buffer-local state has. Solution: Drop sticky/inherit behavior of buffer-local CWD (:bcd). - do_ecmd: always apply the new curbuf's dir (`fix_current_dir`), like `do_autochdir` already does. :tabnew from a :bcd buffer now reverts to global CWD (and fires DirChanged), same as :tabnew from a :lcd window. - curbuf_reusable(): recycling a scratch buffer frees its b_localdir. To get sticky/inherit behavior of CWD, use `:lcd`.
This commit is contained in:
@@ -1778,7 +1778,7 @@ void set_curbuf(buf_T *buf, int action, bool update_jumplist)
|
||||
}
|
||||
|
||||
// Maybe cd to buffer-local directory
|
||||
fix_current_dir(false);
|
||||
update_cwd(kCdCauseBuffer);
|
||||
}
|
||||
|
||||
/// Enter a new current buffer.
|
||||
@@ -2031,8 +2031,6 @@ buf_T *buflist_new(char *ffname_arg, char *sfname_arg, linenr_T lnum, int flags)
|
||||
trigger_undo_ftplugin(buf, curwin);
|
||||
// It's like this buffer is deleted. Watch out for autocommands that
|
||||
// change curbuf! If that happens, allocate a new buffer anyway.
|
||||
// We also ask it to not free the buffer-local directory so we can reuse
|
||||
// it.
|
||||
buf_freeall(buf, BFA_WIPE | BFA_DEL);
|
||||
if (aborting()) { // autocmds may abort script processing
|
||||
xfree(ffname);
|
||||
@@ -2162,8 +2160,6 @@ bool curbuf_reusable(void)
|
||||
&& curbuf->b_ffname == NULL
|
||||
&& curbuf->b_nwindows <= 1
|
||||
&& !curbuf->terminal
|
||||
&& curbuf->b_localdir == NULL
|
||||
&& curbuf->b_prevdir == NULL
|
||||
&& (curbuf->b_ml.ml_mfp == NULL || buf_is_empty(curbuf))
|
||||
&& !bt_quickfix(curbuf)
|
||||
&& !curbufIsChanged());
|
||||
|
||||
Reference in New Issue
Block a user