diff --git a/lua/nvim-tree/actions/finders/find-file.lua b/lua/nvim-tree/actions/finders/find-file.lua index 845870d99fd..0d22816503b 100644 --- a/lua/nvim-tree/actions/finders/find-file.lua +++ b/lua/nvim-tree/actions/finders/find-file.lua @@ -30,8 +30,10 @@ function M.fn(fname) local profile = log.profile_start("find file %s", fname_real) - -- we cannot wait for watchers - reload.refresh_nodes_for_path(vim.fn.fnamemodify(fname_real, ":h")) + -- we cannot wait for watchers to populate a new node + if utils.get_node_from_path(fname_real) == nil then + reload.refresh_nodes_for_path(vim.fn.fnamemodify(fname_real, ":h")) + end local line = core.get_nodes_starting_line() diff --git a/lua/nvim-tree/explorer/reload.lua b/lua/nvim-tree/explorer/reload.lua index 77386415853..b42d27cd314 100644 --- a/lua/nvim-tree/explorer/reload.lua +++ b/lua/nvim-tree/explorer/reload.lua @@ -166,6 +166,9 @@ function M.refresh_nodes_for_path(path) local profile = log.profile_start("refresh_nodes_for_path %s", path) + -- avoids cycles + local absolute_paths_refreshed = {} + NodeIterator.builder({ explorer }) :hidden() :recursor(function(node) @@ -177,10 +180,13 @@ function M.refresh_nodes_for_path(path) end end) :applier(function(node) - local abs_contains = node.absolute_path and path:match("^" .. node.absolute_path) - local link_contains = node.link_to and path:match("^" .. node.link_to) + local abs_contains = node.absolute_path and path:find(node.absolute_path, 1, true) == 1 + local link_contains = node.link_to and path:find(node.link_to, 1, true) == 1 if abs_contains or link_contains then - M.refresh_node(node) + if not absolute_paths_refreshed[node.absolute_path] then + absolute_paths_refreshed[node.absolute_path] = true + M.refresh_node(node) + end end end) :iterate()