aboutsummaryrefslogtreecommitdiff
path: root/test/functional/plugin/dir_spec.lua
diff options
context:
space:
mode:
authorBarrett Ruth <62671086+barrettruth@users.noreply.github.com>2026-07-13 14:10:19 -0500
committerGitHub <noreply@github.com>2026-07-13 15:10:19 -0400
commit73bb6a8a5e3fa20336e27159df4b9112b33398bc (patch)
tree1e396f07b5c3bd3f2a5546e5ccf68bb89da38d8e /test/functional/plugin/dir_spec.lua
parent4d736cd41feb863274ccc73cf9e10407bdddd913 (diff)
downloadrneovim-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.lua30
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()