diff options
| author | Justin M. Keyes <justinkz@gmail.com> | 2026-08-22 16:24:05 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-22 16:24:05 -0400 |
| commit | b296666e419cdf7a673fdac7c348d0d95577f5ac (patch) | |
| tree | 0728bfa4a8081d0394a17459eb4a4b447198a7d4 /runtime/lua/vim/range.lua | |
| parent | 9b0bc7edef82200a7461332b75208a2160854226 (diff) | |
| download | rneovim-b296666e419cdf7a673fdac7c348d0d95577f5ac.tar.gz rneovim-b296666e419cdf7a673fdac7c348d0d95577f5ac.tar.bz2 rneovim-b296666e419cdf7a673fdac7c348d0d95577f5ac.zip | |
fix(cwd): stale buffer names after temp context-switch #41433
Problem:
1. `ctx_dirs_restore()` is the only chdir site that doesn't re-shorten
buffer names; `post_chdir()`, `update_cwd()` and `do_autochdir()` all
call `shorten_fnames(true)`. So after a temp window-context switch
that moved the CWD, every buffer's `b_fname` is still relative to the
other directory. ui2 renders messages in a float, and entering it is
such a switch, so with a `:bcd` in a `BufReadPost` handler 'statusline'
"%f" shows ".config/nvim/init.lua" while the CWD is already
`~/.config/nvim`, and :write resolves the name against it:
```
E212: Can't open file for writing: no such file or directory
```
2. `msg_multihl()` leaves `msg_ext_id` pointing at the caller's storage
when nothing was emitted (e.g. 'msg_silent'): the reset only ran on
a flush that produced chunks. The next message then ships a dead
stack frame as its msg_show id. After ":silent write" the id is
buf_write()'s `msg_id[MAXPATHL + 32]`:
```
id = "\0\0\0\0\0\0\0\0\29\0(<C6>k\24R\17p<C7><C7><C7>\1\0\0\0..."
```
Solution:
1. `shorten_fnames(true)` after restoring the CWD. Drop `cs_save_sfname`,
which was a partial workaround for the same bug.
2. Release the id in `msg_multihl()`, where it is set and the caller's
frame is still alive. Stop reading `.data.integer` out of a String
union member.
Diffstat (limited to 'runtime/lua/vim/range.lua')
0 files changed, 0 insertions, 0 deletions