@@ -3,6 +3,7 @@ local view = require "nvim-tree.view"
33local core = require " nvim-tree.core"
44local utils = require " nvim-tree.utils"
55local events = require " nvim-tree.events"
6+ local explorer_node = require " nvim-tree.explorer.node"
67
78--- @class LibOpenOpts
89--- @field path string | nil path
@@ -86,6 +87,32 @@ function M.get_last_group_node(node)
8687 return node
8788end
8889
90+ --- Group empty folders
91+ --- @param node Node
92+ --- @return Node[]
93+ function M .group_empty_folders (node )
94+ local is_root = not node .parent
95+ local child_folder_only = explorer_node .has_one_child_folder (node ) and node .nodes [1 ]
96+ if M .group_empty and not is_root and child_folder_only then
97+ node .group_next = child_folder_only
98+ local ns = M .group_empty_folders (child_folder_only )
99+ node .nodes = ns or {}
100+ return ns
101+ end
102+ return node .nodes
103+ end
104+
105+ --- Group empty folders
106+ --- @param node Node
107+ function M .ungroup_empty_folders (node )
108+ local cur = node
109+ while cur and cur .group_next do
110+ cur .nodes = { cur .group_next }
111+ cur .group_next = nil
112+ cur = cur .nodes [1 ]
113+ end
114+ end
115+
89116--- @param node Node
90117--- @return Node[]
91118function M .get_all_nodes_in_group (node )
@@ -108,9 +135,17 @@ function M.expand_or_collapse(node)
108135 core .get_explorer ():expand (node )
109136 end
110137
111- local open = not M .get_last_group_node (node ).open
112- for _ , n in ipairs (M .get_all_nodes_in_group (node )) do
113- n .open = open
138+ local open = M .get_last_group_node (node ).open
139+ local head_node = utils .get_parent_of_group (node )
140+ local is_grouped = head_node .group_next ~= nil
141+
142+ if open and is_grouped then
143+ M .ungroup_empty_folders (head_node )
144+ elseif open then
145+ M .group_empty_folders (head_node )
146+ end
147+ for _ , n in ipairs (M .get_all_nodes_in_group (head_node )) do
148+ n .open = is_grouped or not open
114149 end
115150
116151 renderer .draw ()
@@ -213,6 +248,7 @@ function M.setup(opts)
213248 M .hijack_directories = opts .hijack_directories
214249 M .respect_buf_cwd = opts .respect_buf_cwd
215250 M .select_prompts = opts .select_prompts
251+ M .group_empty = opts .renderer .group_empty
216252end
217253
218254return M
0 commit comments