Skip to content

Commit 51c6b46

Browse files
juefei yanjuefei yan
juefei yan
authored and
juefei yan
committed
feat: ungrouping empty directories
1 parent f39f7b6 commit 51c6b46

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

lua/nvim-tree/lib.lua

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ local view = require "nvim-tree.view"
33
local core = require "nvim-tree.core"
44
local utils = require "nvim-tree.utils"
55
local 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
8788
end
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[]
91118
function 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
216252
end
217253

218254
return M

0 commit comments

Comments
 (0)