From 3d5de7fd113df5aae395e7fcf23e5105b59e3caf Mon Sep 17 00:00:00 2001 From: Barrett Ruth <62671086+barrettruth@users.noreply.github.com> Date: Sun, 26 Jul 2026 04:36:03 -0500 Subject: [PATCH] fix(buffer): name becomes empty when it is the cwd #40980 Problem: Shortening the name of a buffer whose full name is the current directory + path sep yields empty string -> buf unnamed. This doesn't interact well with things like `:mksession`, which for example could `:badd` with no arg -> E471. Solution: Keep the full path when shortening yields an empty name, as `path_try_shorten_fname()` already does. --- src/nvim/fileio.c | 5 ++--- test/functional/ex_cmds/mksession_spec.lua | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 465d9e2668..9a23cb7edf 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -2378,11 +2378,10 @@ void shorten_buf_fname(buf_T *buf, char *dirname, int force) XFREE_CLEAR(buf->b_sfname); } char *p = path_shorten_fname(buf->b_ffname, dirname); - if (p != NULL) { + if (p != NULL && *p != NUL) { buf->b_sfname = xstrdup(p); buf->b_fname = buf->b_sfname; - } - if (p == NULL) { + } else { buf->b_fname = buf->b_ffname; } } diff --git a/test/functional/ex_cmds/mksession_spec.lua b/test/functional/ex_cmds/mksession_spec.lua index 40d6564eba..81e39889de 100644 --- a/test/functional/ex_cmds/mksession_spec.lua +++ b/test/functional/ex_cmds/mksession_spec.lua @@ -188,6 +188,22 @@ describe(':mksession', function() eq(expected, api.nvim_buf_get_name(0)) end) + it('restores a directory buffer for the CWD #40939', function() + local cwd_dir = t.fix_slashes(fn.getcwd()) + local expected = cwd_dir .. '/' + + command('set sessionoptions=buffers,curdir') + command('edit ' .. cwd_dir) + command('cd ' .. cwd_dir) + neq('', fn.bufname('%')) + eq(expected, api.nvim_buf_get_name(0)) + + command('mksession ' .. session_file) + command('%bwipeout!') + command('source ' .. session_file) + eq(expected, api.nvim_buf_get_name(0)) + end) + it('restores CWD for :terminal buffers #11288', function() local cwd_dir = fn.fnamemodify('.', ':p:~'):gsub([[/*$]], '') local session_path = cwd_dir .. '/' .. session_file