Skip to content

Commit 2d414ec

Browse files
committed
refactor(#2830): multi instance marks
1 parent a8c2206 commit 2d414ec

File tree

6 files changed

+105
-138
lines changed

6 files changed

+105
-138
lines changed

doc/nvim-tree-lua.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -2195,8 +2195,8 @@ marks.navigate.prev() *nvim-tree-api.marks.navigate.prev()*
21952195
As per |nvim-tree-api.marks.navigate.next()|
21962196

21972197
marks.navigate.select() *nvim-tree-api.marks.navigate.select()*
2198-
Prompts for selection of a marked node as per
2199-
|nvim-tree-api.marks.navigate.next()|
2198+
Prompts for selection of a marked node, sorted by absolute paths.
2199+
A folder will be focused, a file will be opened.
22002200

22012201
==============================================================================
22022202
6.8 API CONFIG *nvim-tree-api.config*

lua/nvim-tree.lua

-1
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,6 @@ 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()
844843
require("nvim-tree.buffers").setup(opts)
845844
require("nvim-tree.help").setup(opts)
846845
require("nvim-tree.watcher").setup(opts)

lua/nvim-tree/api.lua

+6-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ local actions = require "nvim-tree.actions"
66
local appearance_diagnostics = require "nvim-tree.appearance.diagnostics"
77
local events = require "nvim-tree.events"
88
local help = require "nvim-tree.help"
9-
local marks_navigation = require "nvim-tree.marks.navigation"
109
local keymap = require "nvim-tree.keymap"
1110
local notify = require "nvim-tree.notify"
1211

@@ -256,12 +255,12 @@ Api.marks.get = wrap_node(wrap_explorer_member("marks", "get"))
256255
Api.marks.list = wrap_explorer_member("marks", "list")
257256
Api.marks.toggle = wrap_node(wrap_explorer_member("marks", "toggle"))
258257
Api.marks.clear = wrap_explorer_member("marks", "clear")
259-
Api.marks.bulk.delete = wrap_explorer_member("marks", "delete")
260-
Api.marks.bulk.trash = wrap_explorer_member("marks", "trash")
261-
Api.marks.bulk.move = wrap_explorer_member("marks", "move")
262-
Api.marks.navigate.next = wrap(marks_navigation.next)
263-
Api.marks.navigate.prev = wrap(marks_navigation.prev)
264-
Api.marks.navigate.select = wrap(marks_navigation.select)
258+
Api.marks.bulk.delete = wrap_explorer_member("marks", "bulk_delete")
259+
Api.marks.bulk.trash = wrap_explorer_member("marks", "bulk_trash")
260+
Api.marks.bulk.move = wrap_explorer_member("marks", "bulk_move")
261+
Api.marks.navigate.next = wrap_explorer_member("marks", "navigate_next")
262+
Api.marks.navigate.prev = wrap_explorer_member("marks", "navigate_prev")
263+
Api.marks.navigate.select = wrap_explorer_member("marks", "navigate_select")
265264

266265
Api.config.mappings.get_keymap = wrap(keymap.get_keymap)
267266
Api.config.mappings.get_keymap_default = wrap(keymap.get_keymap_default)

lua/nvim-tree/explorer/init.lua

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ local notify = require "nvim-tree.notify"
33
local watch = require "nvim-tree.explorer.watch"
44
local explorer_node = require "nvim-tree.explorer.node"
55
local Filters = require "nvim-tree.explorer.filters"
6-
local Marks = require "nvim-tree.marks"
6+
local Marks = {} -- circular dependencies
77
local LiveFilter = require "nvim-tree.explorer.live-filter"
88
local Sorters = require "nvim-tree.explorer.sorters"
99

@@ -85,6 +85,8 @@ function M.setup(opts)
8585
require("nvim-tree.explorer.explore").setup(opts)
8686
require("nvim-tree.explorer.reload").setup(opts)
8787
require("nvim-tree.explorer.watch").setup(opts)
88+
89+
Marks = require "nvim-tree.marks"
8890
end
8991

9092
M.Explorer = Explorer

lua/nvim-tree/marks/init.lua

+94-16
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
local core = {} -- circular dependency
2-
local lib = {} -- circular dependency
1+
local Iterator = require "nvim-tree.iterators.node-iterator"
2+
local core = require "nvim-tree.core"
3+
local lib = require "nvim-tree.lib"
34
local notify = require "nvim-tree.notify"
4-
local remove_file = {} -- circular dependency
5-
local rename_file = {} -- circular dependency
6-
local trash = {} -- circular dependency
7-
local renderer = {} -- circular dependency
5+
local open_file = require "nvim-tree.actions.node.open-file"
6+
local remove_file = require "nvim-tree.actions.fs.remove-file"
7+
local rename_file = require "nvim-tree.actions.fs.rename-file"
8+
local renderer = require "nvim-tree.renderer"
9+
local trash = require "nvim-tree.actions.fs.trash"
810
local utils = require "nvim-tree.utils"
911

1012
---@class Marks
@@ -84,7 +86,7 @@ end
8486

8587
---Delete marked; each removal will be optionally notified
8688
---@public
87-
function Marks:delete()
89+
function Marks:bulk_delete()
8890
if not next(self.marks) then
8991
notify.warn "No bookmarks to delete."
9092
return
@@ -113,7 +115,7 @@ end
113115

114116
---Trash marked; each removal will be optionally notified
115117
---@public
116-
function Marks:trash()
118+
function Marks:bulk_trash()
117119
if not next(self.marks) then
118120
notify.warn "No bookmarks to trash."
119121
return
@@ -142,7 +144,7 @@ end
142144

143145
---Move marked
144146
---@public
145-
function Marks:move()
147+
function Marks:bulk_move()
146148
if not next(self.marks) then
147149
notify.warn "No bookmarks to move."
148150
return
@@ -183,13 +185,89 @@ function Marks:move()
183185
end)
184186
end
185187

186-
function Marks.setup()
187-
core = require "nvim-tree.core"
188-
lib = require "nvim-tree.lib"
189-
remove_file = require "nvim-tree.actions.fs.remove-file"
190-
rename_file = require "nvim-tree.actions.fs.rename-file"
191-
renderer = require "nvim-tree.renderer"
192-
trash = require "nvim-tree.actions.fs.trash"
188+
---Focus nearest marked node in direction.
189+
---@private
190+
---@param up boolean
191+
function Marks:navigate(up)
192+
local node = lib.get_node_at_cursor()
193+
if not node then
194+
return
195+
end
196+
197+
local first, prev, next, last = nil, nil, nil, nil
198+
local found = false
199+
200+
Iterator.builder(self.explorer.nodes)
201+
:recursor(function(n)
202+
return n.open and n.nodes
203+
end)
204+
:applier(function(n)
205+
if n.absolute_path == node.absolute_path then
206+
found = true
207+
return
208+
end
209+
210+
if not self:get(n) then
211+
return
212+
end
213+
214+
last = n
215+
first = first or n
216+
217+
if found and not next then
218+
next = n
219+
end
220+
221+
if not found then
222+
prev = n
223+
end
224+
end)
225+
:iterate()
226+
227+
if not found then
228+
return
229+
end
230+
231+
if up then
232+
utils.focus_node_or_parent(prev or last)
233+
else
234+
utils.focus_node_or_parent(next or first)
235+
end
236+
end
237+
238+
---@public
239+
function Marks:navigate_prev()
240+
self:navigate(true)
241+
end
242+
243+
---@public
244+
function Marks:navigate_next()
245+
self:navigate(false)
246+
end
247+
248+
---Prompts for selection of a marked node, sorted by absolute paths.
249+
---A folder will be focused, a file will be opened.
250+
---@public
251+
function Marks:navigate_select()
252+
local list = vim.tbl_map(function(n)
253+
return n.absolute_path
254+
end, self:list())
255+
256+
table.sort(list)
257+
258+
vim.ui.select(list, {
259+
prompt = "Select a file to open or a folder to focus",
260+
}, function(choice)
261+
if not choice or choice == "" then
262+
return
263+
end
264+
local node = self:get { absolute_path = choice }
265+
if node and not node.nodes and not utils.get_win_buf_from_path(node.absolute_path) then
266+
open_file.fn("edit", node.absolute_path)
267+
elseif node then
268+
utils.focus_file(node.absolute_path)
269+
end
270+
end)
193271
end
194272

195273
return Marks

lua/nvim-tree/marks/navigation.lua

-111
This file was deleted.

0 commit comments

Comments
 (0)