@@ -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,34 @@ function M.get_last_group_node(node)
8687 return node
8788end
8889
90+ --- Group empty folders
91+ -- Recursively group nodes
92+ --- @param node Node
93+ --- @return Node[]
94+ function M .group_empty_folders (node )
95+ local is_root = not node .parent
96+ local child_folder_only = explorer_node .has_one_child_folder (node ) and node .nodes [1 ]
97+ if M .group_empty and not is_root and child_folder_only then
98+ node .group_next = child_folder_only
99+ local ns = M .group_empty_folders (child_folder_only )
100+ node .nodes = ns or {}
101+ return ns
102+ end
103+ return node .nodes
104+ end
105+
106+ --- Ungroup empty folders
107+ -- If a node is grouped, ungroup it: put node.group_next to the node.nodes and set node.group_next to nil
108+ --- @param node Node
109+ function M .ungroup_empty_folders (node )
110+ local cur = node
111+ while cur and cur .group_next do
112+ cur .nodes = { cur .group_next }
113+ cur .group_next = nil
114+ cur = cur .nodes [1 ]
115+ end
116+ end
117+
89118--- @param node Node
90119--- @return Node[]
91120function M .get_all_nodes_in_group (node )
@@ -98,8 +127,21 @@ function M.get_all_nodes_in_group(node)
98127 return nodes
99128end
100129
130+ -- Toggle group empty folders
131+ --- @param head_node Node
132+ local function toggle_group_folders (head_node )
133+ local is_grouped = head_node .group_next ~= nil
134+
135+ if is_grouped then
136+ M .ungroup_empty_folders (head_node )
137+ else
138+ M .group_empty_folders (head_node )
139+ end
140+ end
141+
101142--- @param node Node
102- function M .expand_or_collapse (node )
143+ function M .expand_or_collapse (node , toggle_group )
144+ toggle_group = toggle_group or false
103145 if node .has_children then
104146 node .has_children = false
105147 end
@@ -108,9 +150,20 @@ function M.expand_or_collapse(node)
108150 core .get_explorer ():expand (node )
109151 end
110152
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
153+ local head_node = utils .get_parent_of_group (node )
154+ if toggle_group then
155+ toggle_group_folders (head_node )
156+ end
157+
158+ local open = M .get_last_group_node (node ).open
159+ local next_open
160+ if toggle_group then
161+ next_open = open
162+ else
163+ next_open = not open
164+ end
165+ for _ , n in ipairs (M .get_all_nodes_in_group (head_node )) do
166+ n .open = next_open
114167 end
115168
116169 renderer .draw ()
@@ -213,6 +266,7 @@ function M.setup(opts)
213266 M .hijack_directories = opts .hijack_directories
214267 M .respect_buf_cwd = opts .respect_buf_cwd
215268 M .select_prompts = opts .select_prompts
269+ M .group_empty = opts .renderer .group_empty
216270end
217271
218272return M
0 commit comments