Skip to content

Commit 741511a

Browse files
committed
refactor(#2830): multi instance marks
1 parent ad0b95d commit 741511a

File tree

7 files changed

+115
-96
lines changed

7 files changed

+115
-96
lines changed

lua/nvim-tree.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ function M.setup(conf)
840840
require("nvim-tree.view").setup(opts)
841841
require("nvim-tree.lib").setup(opts)
842842
require("nvim-tree.renderer").setup(opts)
843-
require("nvim-tree.marks").setup(opts)
843+
require("nvim-tree.marks").setup()
844844
require("nvim-tree.buffers").setup(opts)
845845
require("nvim-tree.help").setup(opts)
846846
require("nvim-tree.watcher").setup(opts)

lua/nvim-tree/api.lua

+15-30
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@ local appearance_diagnostics = require "nvim-tree.appearance.diagnostics"
77
local events = require "nvim-tree.events"
88
local help = require "nvim-tree.help"
99
local marks_navigation = require "nvim-tree.marks.navigation"
10-
local marks_bulk_delete = require "nvim-tree.marks.bulk-delete"
11-
local marks_bulk_trash = require "nvim-tree.marks.bulk-trash"
12-
local marks_bulk_move = require "nvim-tree.marks.bulk-move"
1310
local keymap = require "nvim-tree.keymap"
1411
local notify = require "nvim-tree.notify"
1512

@@ -76,28 +73,16 @@ local function wrap_node_or_nil(fn)
7673
end
7774
end
7875

79-
---Inject the explorer as the first argument if present otherwise do nothing.
80-
---@param fn function function to invoke
81-
---@return fun(...) : any
82-
local function wrap_explorer(fn)
83-
return function(...)
84-
local explorer = core.get_explorer()
85-
if explorer then
86-
return fn(explorer, ...)
87-
end
88-
end
89-
end
90-
9176
---Invoke a member's method on the singleton explorer.
9277
---Print error when setup not called.
93-
---@param explorer_member string explorer member name
94-
---@param member_method string method name to invoke on member
78+
---@param member string explorer member name
79+
---@param method string method name to invoke on member
9580
---@return fun(...) : any
96-
local function wrap_explorer_member(explorer_member, member_method)
81+
local function explorer(member, method)
9782
return wrap(function(...)
98-
local explorer = core.get_explorer()
99-
if explorer then
100-
return explorer[explorer_member][member_method](explorer[explorer_member], ...)
83+
local e = core.get_explorer()
84+
if e then
85+
return e[member][method](e[member], ...)
10186
end
10287
end)
10388
end
@@ -264,16 +249,16 @@ Api.git.reload = wrap(actions.reloaders.reload_git)
264249
Api.events.subscribe = events.subscribe
265250
Api.events.Event = events.Event
266251

267-
Api.live_filter.start = wrap_explorer_member("live_filter", "start_filtering")
268-
Api.live_filter.clear = wrap_explorer_member("live_filter", "clear_filter")
252+
Api.live_filter.start = explorer("live_filter", "start_filtering")
253+
Api.live_filter.clear = explorer("live_filter", "clear_filter")
269254

270-
Api.marks.get = wrap_node(wrap_explorer_member("marks", "get_mark"))
271-
Api.marks.list = wrap_explorer_member("marks", "get_marks")
272-
Api.marks.toggle = wrap_node(wrap_explorer_member("marks", "toggle_mark"))
273-
Api.marks.clear = wrap_explorer_member("marks", "clear_marks")
274-
Api.marks.bulk.delete = wrap_explorer(marks_bulk_delete.bulk_delete)
275-
Api.marks.bulk.trash = wrap_explorer(marks_bulk_trash.bulk_trash)
276-
Api.marks.bulk.move = wrap_explorer(marks_bulk_move.bulk_move)
255+
Api.marks.get = wrap_node(explorer("marks", "get_mark"))
256+
Api.marks.list = explorer("marks", "get_marks")
257+
Api.marks.toggle = wrap_node(explorer("marks", "toggle_mark"))
258+
Api.marks.clear = explorer("marks", "clear_marks")
259+
Api.marks.bulk.delete = explorer("bulk_delete", "bulk_delete")
260+
Api.marks.bulk.trash = explorer("bulk_trash", "bulk_trash")
261+
Api.marks.bulk.move = explorer("bulk_move", "bulk_move")
277262
Api.marks.navigate.next = wrap(marks_navigation.next)
278263
Api.marks.navigate.prev = wrap(marks_navigation.prev)
279264
Api.marks.navigate.select = wrap(marks_navigation.select)

lua/nvim-tree/explorer/init.lua

+14
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ local watch = require "nvim-tree.explorer.watch"
44
local explorer_node = require "nvim-tree.explorer.node"
55
local Filters = require "nvim-tree.explorer.filters"
66
local Marks = require "nvim-tree.marks"
7+
local BulkDelete -- cyclic
8+
local BulkMove -- cyclic
9+
local BulkTrash -- cyclic
710
local LiveFilter = require "nvim-tree.explorer.live-filter"
811
local Sorters = require "nvim-tree.explorer.sorters"
912

@@ -18,6 +21,9 @@ M.reload = require("nvim-tree.explorer.reload").reload
1821
---@field open boolean
1922
---@field filters Filters
2023
---@field live_filter LiveFilter
24+
---@field bulk_delete BulkDelete
25+
---@field bulk_move BulkMove
26+
---@field bulk_trash BulkTrash
2127
---@field sorters Sorter
2228
---@field marks Marks
2329

@@ -50,6 +56,9 @@ function Explorer.new(path)
5056
explorer.watcher = watch.create_watcher(explorer)
5157
explorer.filters = Filters:new(M.config, explorer)
5258
explorer.live_filter = LiveFilter:new(M.config, explorer)
59+
explorer.bulk_delete = BulkDelete:new(M.config, explorer)
60+
explorer.bulk_move = BulkMove:new(M.config, explorer)
61+
explorer.bulk_trash = BulkTrash:new(M.config, explorer)
5362
explorer:_load(explorer)
5463
return explorer
5564
end
@@ -85,6 +94,11 @@ function M.setup(opts)
8594
require("nvim-tree.explorer.explore").setup(opts)
8695
require("nvim-tree.explorer.reload").setup(opts)
8796
require("nvim-tree.explorer.watch").setup(opts)
97+
98+
-- cyclic
99+
BulkDelete = require "nvim-tree.marks.bulk-delete"
100+
BulkMove = require "nvim-tree.marks.bulk-move"
101+
BulkTrash = require "nvim-tree.marks.bulk-trash"
88102
end
89103

90104
M.Explorer = Explorer

lua/nvim-tree/marks/bulk-delete.lua

+29-21
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,65 @@ local remove_file = require "nvim-tree.actions.fs.remove-file"
33
local notify = require "nvim-tree.notify"
44
local lib = require "nvim-tree.lib"
55

6-
local M = {
7-
config = {},
8-
}
6+
---@class BulkDelete
7+
---@field private explorer Explorer
8+
---@field private config table hydrated user opts.filters
9+
local BulkDelete = {}
10+
11+
---@param opts table user options
12+
---@param explorer Explorer
13+
---@return Filters
14+
function BulkDelete:new(opts, explorer)
15+
local o = {
16+
config = {
17+
ui = opts.ui,
18+
filesystem_watchers = opts.filesystem_watchers,
19+
},
20+
explorer = explorer,
21+
}
22+
23+
setmetatable(o, self)
24+
self.__index = self
25+
return o
26+
end
927

1028
--- Delete nodes; each removal will be optionally notified
1129
---@param nodes Node[]
1230
---@param marks Marks
13-
local function do_delete(marks, nodes)
31+
function BulkDelete:do_delete(marks, nodes)
1432
for _, node in pairs(nodes) do
1533
remove_file.remove(node)
1634
end
1735

1836
marks:clear_marks()
1937

20-
if not M.config.filesystem_watchers.enable then
38+
if not self.config.filesystem_watchers.enable then
2139
require("nvim-tree.actions.reloaders").reload_explorer()
2240
end
2341
end
2442

2543
--- Delete marked nodes, optionally prompting
26-
---@param explorer Explorer
27-
function M.bulk_delete(explorer)
28-
if not explorer then
29-
return
30-
end
31-
32-
local marks = explorer.marks
44+
function BulkDelete:bulk_delete()
45+
local marks = self.explorer.marks
3346

3447
local nodes = marks:get_marks()
3548
if not nodes or #nodes == 0 then
3649
notify.warn "No bookmarksed to delete."
3750
return
3851
end
3952

40-
if M.config.ui.confirm.remove then
53+
if self.config.ui.confirm.remove then
4154
local prompt_select = "Remove bookmarked ?"
4255
local prompt_input = prompt_select .. " y/N: "
4356
lib.prompt(prompt_input, prompt_select, { "", "y" }, { "No", "Yes" }, "nvimtree_bulk_delete", function(item_short)
4457
utils.clear_prompt()
4558
if item_short == "y" then
46-
do_delete(marks, nodes)
59+
self:do_delete(marks, nodes)
4760
end
4861
end)
4962
else
50-
do_delete(marks, nodes)
63+
self:do_delete(marks, nodes)
5164
end
5265
end
5366

54-
function M.setup(opts)
55-
M.config.ui = opts.ui
56-
M.config.filesystem_watchers = opts.filesystem_watchers
57-
end
58-
59-
return M
67+
return BulkDelete

lua/nvim-tree/marks/bulk-move.lua

+23-14
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,29 @@ local rename_file = require "nvim-tree.actions.fs.rename-file"
44
local notify = require "nvim-tree.notify"
55
local lib = require "nvim-tree.lib"
66

7-
local M = {
8-
config = {},
9-
}
7+
---@class BulkMove
8+
---@field private explorer Explorer
9+
---@field private config table hydrated user opts.filters
10+
local BulkMove = {}
1011

12+
---@param opts table user options
1113
---@param explorer Explorer
12-
function M.bulk_move(explorer)
13-
if not explorer then
14-
return
15-
end
16-
local marks = explorer.marks
14+
---@return Filters
15+
function BulkMove:new(opts, explorer)
16+
local o = {
17+
config = {
18+
filesystem_watchers = opts.filesystem_watchers,
19+
},
20+
explorer = explorer,
21+
}
22+
23+
setmetatable(o, self)
24+
self.__index = self
25+
return o
26+
end
27+
28+
function BulkMove:bulk_move()
29+
local marks = self.explorer.marks
1730

1831
if #marks:get_marks() == 0 then
1932
notify.warn "No bookmarks to move."
@@ -54,14 +67,10 @@ function M.bulk_move(explorer)
5467

5568
marks:clear_marks()
5669

57-
if not M.config.filesystem_watchers.enable then
70+
if not self.config.filesystem_watchers.enable then
5871
require("nvim-tree.actions.reloaders").reload_explorer()
5972
end
6073
end)
6174
end
6275

63-
function M.setup(opts)
64-
M.config.filesystem_watchers = opts.filesystem_watchers
65-
end
66-
67-
return M
76+
return BulkMove

lua/nvim-tree/marks/bulk-trash.lua

+32-25
Original file line numberDiff line numberDiff line change
@@ -3,51 +3,58 @@ local remove_file = require "nvim-tree.actions.fs.trash"
33
local notify = require "nvim-tree.notify"
44
local lib = require "nvim-tree.lib"
55

6-
local M = {
7-
config = {},
8-
}
6+
---@class BulkTrash
7+
---@field private explorer Explorer
8+
---@field private config table hydrated user opts.filters
9+
local BulkTrash = {}
910

10-
--- Delete nodes; each removal will be optionally notified
11+
---@param opts table user options
12+
---@param explorer Explorer
13+
---@return Filters
14+
function BulkTrash:new(opts, explorer)
15+
local o = {
16+
config = {
17+
ui = opts.ui,
18+
filesystem_watchers = opts.filesystem_watchers,
19+
},
20+
explorer = explorer,
21+
}
22+
23+
setmetatable(o, self)
24+
self.__index = self
25+
return o
26+
end
27+
28+
---Delete nodes; each removal will be optionally notified
29+
---@private
1130
---@param nodes Node[]
12-
local function do_trash(nodes)
31+
function BulkTrash:do_trash(nodes)
1332
for _, node in pairs(nodes) do
1433
remove_file.remove(node)
1534
end
1635
end
1736

18-
---@param explorer Explorer
19-
function M.bulk_trash(explorer)
20-
if not explorer then
21-
return
22-
end
23-
24-
local marks = explorer.marks
25-
26-
local nodes = marks:get_marks()
37+
function BulkTrash:bulk_trash()
38+
local nodes = self.explorer.marks:get_marks()
2739
if not nodes or #nodes == 0 then
2840
notify.warn "No bookmarks to trash."
2941
return
3042
end
3143

32-
if M.config.ui.confirm.trash then
44+
if self.config.ui.confirm.trash then
3345
local prompt_select = "Trash bookmarked ?"
3446
local prompt_input = prompt_select .. " y/N: "
3547
lib.prompt(prompt_input, prompt_select, { "", "y" }, { "No", "Yes" }, "nvimtree_bulk_trash", function(item_short)
3648
utils.clear_prompt()
3749
if item_short == "y" then
38-
do_trash(nodes)
39-
marks:clear_marks()
50+
self:do_trash(nodes)
51+
self.explorer.marks:clear_marks()
4052
end
4153
end)
4254
else
43-
do_trash(nodes)
44-
marks:clear_marks()
55+
self:do_trash(nodes)
56+
self.explorer.marks:clear_marks()
4557
end
4658
end
4759

48-
function M.setup(opts)
49-
M.config.ui = opts.ui
50-
M.config.filesystem_watchers = opts.filesystem_watchers
51-
end
52-
53-
return M
60+
return BulkTrash

lua/nvim-tree/marks/init.lua

+1-5
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,8 @@ function Marks:get_marks()
6767
return list
6868
end
6969

70-
function Marks.setup(opts)
70+
function Marks.setup()
7171
renderer = require "nvim-tree.renderer"
72-
73-
require("nvim-tree.marks.bulk-delete").setup(opts)
74-
require("nvim-tree.marks.bulk-trash").setup(opts)
75-
require("nvim-tree.marks.bulk-move").setup(opts)
7672
end
7773

7874
return Marks

0 commit comments

Comments
 (0)