@@ -3,6 +3,7 @@ local view = require "nvim-tree.view"
3
3
local core = require " nvim-tree.core"
4
4
local utils = require " nvim-tree.utils"
5
5
local events = require " nvim-tree.events"
6
+ local explorer_node = require " nvim-tree.explorer.node"
6
7
7
8
--- @class LibOpenOpts
8
9
--- @field path string | nil path
@@ -86,6 +87,32 @@ function M.get_last_group_node(node)
86
87
return node
87
88
end
88
89
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
+
89
116
--- @param node Node
90
117
--- @return Node[]
91
118
function M .get_all_nodes_in_group (node )
@@ -108,9 +135,17 @@ function M.expand_or_collapse(node)
108
135
core .get_explorer ():expand (node )
109
136
end
110
137
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
114
149
end
115
150
116
151
renderer .draw ()
@@ -213,6 +248,7 @@ function M.setup(opts)
213
248
M .hijack_directories = opts .hijack_directories
214
249
M .respect_buf_cwd = opts .respect_buf_cwd
215
250
M .select_prompts = opts .select_prompts
251
+ M .group_empty = opts .renderer .group_empty
216
252
end
217
253
218
254
return M
0 commit comments