diff --git a/lua/nvim-tree/actions/finders/find-file.lua b/lua/nvim-tree/actions/finders/find-file.lua index ec3b7436d4e..0a074ffbe21 100644 --- a/lua/nvim-tree/actions/finders/find-file.lua +++ b/lua/nvim-tree/actions/finders/find-file.lua @@ -44,7 +44,9 @@ function M.fn(path) return node.absolute_path == path_real or node.link_to == path_real end) :applier(function(node) - line = line + 1 + if not node.group_next then + line = line + 1 + end if vim.tbl_contains(absolute_paths_searched, node.absolute_path) then return @@ -55,14 +57,16 @@ function M.fn(path) local link_match = node.link_to and vim.startswith(path_real, node.link_to .. utils.path_separator) if abs_match or link_match then - node.open = true + if not node.group_next then + node.open = true + end if #node.nodes == 0 then core.get_explorer():expand(node) end end end) :recursor(function(node) - return node.open and node.nodes + return node.group_next and { node.group_next } or (node.open and #node.nodes > 0 and node.nodes) end) :iterate() diff --git a/lua/nvim-tree/actions/moves/parent.lua b/lua/nvim-tree/actions/moves/parent.lua index 7f428bba9e8..61bce43a75e 100644 --- a/lua/nvim-tree/actions/moves/parent.lua +++ b/lua/nvim-tree/actions/moves/parent.lua @@ -2,6 +2,7 @@ local renderer = require "nvim-tree.renderer" local view = require "nvim-tree.view" local utils = require "nvim-tree.utils" local core = require "nvim-tree.core" +local lib = require "nvim-tree.lib" local M = {} @@ -9,18 +10,13 @@ function M.fn(should_close) should_close = should_close or false return function(node) + node = lib.get_last_group_node(node) if should_close and node.open then node.open = false return renderer.draw() end - local parent = node.parent - - if renderer.config.group_empty and parent then - while parent.parent and parent.parent.group_next do - parent = parent.parent - end - end + local parent = utils.get_parent_of_group(node).parent if not parent or not parent.parent then return view.set_cursor { 1, 0 } diff --git a/lua/nvim-tree/actions/tree-modifiers/collapse-all.lua b/lua/nvim-tree/actions/tree-modifiers/collapse-all.lua index db9518c145d..75459929541 100644 --- a/lua/nvim-tree/actions/tree-modifiers/collapse-all.lua +++ b/lua/nvim-tree/actions/tree-modifiers/collapse-all.lua @@ -36,7 +36,7 @@ function M.fn(keep_buffers) end end) :recursor(function(n) - return n.nodes + return n.group_next and { n.group_next } or n.nodes end) :iterate() diff --git a/lua/nvim-tree/actions/tree-modifiers/expand-all.lua b/lua/nvim-tree/actions/tree-modifiers/expand-all.lua index 04b950386a0..fdc8e989f9e 100644 --- a/lua/nvim-tree/actions/tree-modifiers/expand-all.lua +++ b/lua/nvim-tree/actions/tree-modifiers/expand-all.lua @@ -2,6 +2,7 @@ local core = require "nvim-tree.core" local renderer = require "nvim-tree.renderer" local Iterator = require "nvim-tree.iterators.node-iterator" local notify = require "nvim-tree.notify" +local lib = require "nvim-tree.lib" local M = {} @@ -15,6 +16,7 @@ local function to_lookup_table(list) end local function expand(node) + node = lib.get_last_group_node(node) node.open = true if #node.nodes == 0 then core.get_explorer():expand(node) @@ -45,7 +47,8 @@ local function gen_iterator() end end) :recursor(function(node) - return expansion_count < M.MAX_FOLDER_DISCOVERY and node.open and node.nodes + return expansion_count < M.MAX_FOLDER_DISCOVERY + and (node.group_next and { node.group_next } or (node.open and node.nodes)) end) :iterate() diff --git a/lua/nvim-tree/iterators/node-iterator.lua b/lua/nvim-tree/iterators/node-iterator.lua index e4a1d0bb0fc..c1cf722fed8 100644 --- a/lua/nvim-tree/iterators/node-iterator.lua +++ b/lua/nvim-tree/iterators/node-iterator.lua @@ -42,7 +42,9 @@ function NodeIterator:iterate() local function iter(nodes) for _, node in ipairs(nodes) do if self._filter_hidden(node) then - iteration_count = iteration_count + 1 + if not node.group_next then + iteration_count = iteration_count + 1 + end if self._match(node) then return node, iteration_count end diff --git a/lua/nvim-tree/lib.lua b/lua/nvim-tree/lib.lua index 8bfc15c1dab..c82d06fd173 100644 --- a/lua/nvim-tree/lib.lua +++ b/lua/nvim-tree/lib.lua @@ -81,7 +81,6 @@ function M.get_last_group_node(node) end function M.expand_or_collapse(node) - node.open = not node.open if node.has_children then node.has_children = false end @@ -90,6 +89,9 @@ function M.expand_or_collapse(node) core.get_explorer():expand(node) end + node = M.get_last_group_node(node) + node.open = not node.open + renderer.draw() end diff --git a/lua/nvim-tree/renderer/builder.lua b/lua/nvim-tree/renderer/builder.lua index 04e0ec48f62..4ffded19015 100644 --- a/lua/nvim-tree/renderer/builder.lua +++ b/lua/nvim-tree/renderer/builder.lua @@ -341,6 +341,8 @@ function Builder:_build_line(node, idx, num_children, unloaded_bufnr) self.index = self.index + 1 + node = require("nvim-tree.lib").get_last_group_node(node) + if node.open then self.depth = self.depth + 1 self:build(node, unloaded_bufnr) diff --git a/lua/nvim-tree/utils.lua b/lua/nvim-tree/utils.lua index 608523a8072..a8c472b970c 100644 --- a/lua/nvim-tree/utils.lua +++ b/lua/nvim-tree/utils.lua @@ -89,7 +89,7 @@ function M.find_node(nodes, fn) local node, i = Iterator.builder(nodes) :matcher(fn) :recursor(function(node) - return node.open and #node.nodes > 0 and node.nodes + return node.group_next and { node.group_next } or (node.open and #node.nodes > 0 and node.nodes) end) :iterate() i = require("nvim-tree.view").is_root_folder_visible() and i or i - 1 @@ -146,11 +146,14 @@ function M.get_nodes_by_line(nodes_all, line_start) Iterator.builder(nodes_all) :applier(function(node) + if node.group_next then + return + end nodes_by_line[line] = node line = line + 1 end) :recursor(function(node) - return node.open == true and node.nodes + return node.group_next and { node.group_next } or (node.open and #node.nodes > 0 and node.nodes) end) :iterate()