diff options
| author | Barrett Ruth <62671086+barrettruth@users.noreply.github.com> | 2026-07-13 14:10:19 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-13 15:10:19 -0400 |
| commit | 73bb6a8a5e3fa20336e27159df4b9112b33398bc (patch) | |
| tree | 1e396f07b5c3bd3f2a5546e5ccf68bb89da38d8e /test/functional/plugin/dir_spec.lua | |
| parent | 4d736cd41feb863274ccc73cf9e10407bdddd913 (diff) | |
| download | rneovim-73bb6a8a5e3fa20336e27159df4b9112b33398bc.tar.gz rneovim-73bb6a8a5e3fa20336e27159df4b9112b33398bc.tar.bz2 rneovim-73bb6a8a5e3fa20336e27159df4b9112b33398bc.zip | |
fix(dir): let 3P dir-browser plugin rename the dir buffer #40529
Problem:
`FileType directory` fires *before* the `BufEnter` path where `dir.lua`
populates the buffer, in order to allow a 3P dir-browser plugin to handle the
event and (optionally) rename the buffer to e.g. `example:///tmp/foo/`.
But currently, `open_buffer()` continues after `filetypedetect BufRead` as if
the original directory buffer is *still* current and valid, which may fall
through to the built-in `nvim.dir` path after a 3P plugin ALREADY handled the
directory.
Solution:
Keep a buf ref around the early `filetypedetect BufRead` call for directory
buffers.
If the `FileType directory` handler switches away from/deletes the original
directory buffer, stop the open path instead of continuing into the built-in
`nvim.dir` flow.
Diffstat (limited to 'test/functional/plugin/dir_spec.lua')
| -rw-r--r-- | test/functional/plugin/dir_spec.lua | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/test/functional/plugin/dir_spec.lua b/test/functional/plugin/dir_spec.lua index cd35948cb6..1c6cd01d73 100644 --- a/test/functional/plugin/dir_spec.lua +++ b/test/functional/plugin/dir_spec.lua @@ -105,6 +105,36 @@ describe('nvim.dir', function() line_of('alpha.txt') end) + it('3P dir-browser can handle `FileType directory` event and rename buf', function() + make_fixture() + n.clear({ args_rm = { '-u' } }) + exec_lua(function() + _G.nvim_dir_loaded_in_filetype = nil + vim.api.nvim_create_autocmd('FileType', { + pattern = 'directory', + callback = function(ev) + _G.nvim_dir_loaded_in_filetype = package.loaded['nvim.dir'] ~= nil + local dir = vim.api.nvim_buf_get_name(ev.buf) + local browser = vim.api.nvim_create_buf(false, true) + vim.api.nvim_buf_set_name(browser, 'example://' .. dir) + vim.api.nvim_buf_set_lines(browser, 0, -1, false, { + 'plugin browser for: ' .. dir, + }) + vim.api.nvim_set_current_buf(browser) + vim.api.nvim_buf_delete(ev.buf, { force = true }) + end, + }) + end) + + edit(root) + + eq(false, exec_lua('return _G.nvim_dir_loaded_in_filetype')) + eq('example://' .. root .. '/', api.nvim_buf_get_name(0)) + eq({ 'plugin browser for: ' .. root .. '/' }, lines()) + eq(false, exec_lua([[return package.loaded['nvim.dir'] ~= nil]])) + eq('', exec_capture('messages')) + end) + it('triggers nested autocmds when opening directory buffers', function() make_fixture() |