Skip to content

Commit bdceaf5

Browse files
authored
feat(#1804): add api.marks.bulk.delete with default bd mapping (#2276)
1 parent d4f6d33 commit bdceaf5

File tree

8 files changed

+93
-24
lines changed

8 files changed

+93
-24
lines changed

doc/nvim-tree-lua.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ Show the mappings: `g?`
150150
`.` Run Command |nvim-tree-api.node.run.cmd()|
151151
`-` Up |nvim-tree-api.tree.change_root_to_parent()|
152152
`a` Create |nvim-tree-api.fs.create()|
153+
`bd` Delete Bookmarked |nvim-tree-api.marks.bulk.delete()|
153154
`bmv` Move Bookmarked |nvim-tree-api.marks.bulk.move()|
154155
`B` Toggle No Buffer |nvim-tree-api.tree.toggle_no_buffer_filter()|
155156
`c` Copy |nvim-tree-api.fs.copy.node()|
@@ -1772,6 +1773,9 @@ marks.toggle({node}) *nvim-tree-api.marks.toggle()*
17721773
marks.clear() *nvim-tree-api.marks.clear()*
17731774
Clear all marks.
17741775

1776+
marks.bulk.delete() *nvim-tree-api.marks.bulk.delete()*
1777+
Delete all marked. Optionally prompts.
1778+
17751779
marks.bulk.move() *nvim-tree-api.marks.bulk.move()*
17761780
Prompts for a directory to move all marked nodes into.
17771781

@@ -1934,6 +1938,7 @@ You are encouraged to copy these to your own |nvim-tree.on_attach| function.
19341938
vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command'))
19351939
vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up'))
19361940
vim.keymap.set('n', 'a', api.fs.create, opts('Create'))
1941+
vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts('Delete Bookmarked'))
19371942
vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked'))
19381943
vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer'))
19391944
vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy'))

lua/nvim-tree/actions/fs/remove-file.lua

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -71,27 +71,33 @@ local function remove_dir(cwd)
7171
return vim.loop.fs_rmdir(cwd)
7272
end
7373

74+
--- Remove a node, notify errors, dispatch events
75+
--- @param node table
76+
function M.remove(node)
77+
if node.nodes ~= nil and not node.link_to then
78+
local success = remove_dir(node.absolute_path)
79+
if not success then
80+
return notify.error("Could not remove " .. node.name)
81+
end
82+
events._dispatch_folder_removed(node.absolute_path)
83+
else
84+
local success = vim.loop.fs_unlink(node.absolute_path)
85+
if not success then
86+
return notify.error("Could not remove " .. node.name)
87+
end
88+
events._dispatch_file_removed(node.absolute_path)
89+
clear_buffer(node.absolute_path)
90+
end
91+
notify.info(node.absolute_path .. " was properly removed.")
92+
end
93+
7494
function M.fn(node)
7595
if node.name == ".." then
7696
return
7797
end
7898

7999
local function do_remove()
80-
if node.nodes ~= nil and not node.link_to then
81-
local success = remove_dir(node.absolute_path)
82-
if not success then
83-
return notify.error("Could not remove " .. node.name)
84-
end
85-
events._dispatch_folder_removed(node.absolute_path)
86-
else
87-
local success = vim.loop.fs_unlink(node.absolute_path)
88-
if not success then
89-
return notify.error("Could not remove " .. node.name)
90-
end
91-
events._dispatch_file_removed(node.absolute_path)
92-
clear_buffer(node.absolute_path)
93-
end
94-
notify.info(node.absolute_path .. " was properly removed.")
100+
M.remove(node)
95101
if not M.config.filesystem_watchers.enable then
96102
require("nvim-tree.actions.reloaders.reloaders").reload_explorer()
97103
end

lua/nvim-tree/api.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ Api.marks.get = wrap_node(require("nvim-tree.marks").get_mark)
202202
Api.marks.list = wrap(require("nvim-tree.marks").get_marks)
203203
Api.marks.toggle = wrap_node(require("nvim-tree.marks").toggle_mark)
204204
Api.marks.clear = wrap(require("nvim-tree.marks").clear_marks)
205+
Api.marks.bulk.delete = wrap(require("nvim-tree.marks.bulk-delete").bulk_delete)
205206
Api.marks.bulk.move = wrap(require("nvim-tree.marks.bulk-move").bulk_move)
206207
Api.marks.navigate.next = wrap(require("nvim-tree.marks.navigation").next)
207208
Api.marks.navigate.prev = wrap(require("nvim-tree.marks.navigation").prev)

lua/nvim-tree/keymap-legacy.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ local DEFAULT_ON_ATTACH = [[
100100
vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command'))
101101
vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up'))
102102
vim.keymap.set('n', 'a', api.fs.create, opts('Create'))
103+
vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts('Delete Bookmarked'))
103104
vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked'))
104105
vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer'))
105106
vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy'))

lua/nvim-tree/keymap.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ function M.default_on_attach(bufnr)
4343
vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command'))
4444
vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up'))
4545
vim.keymap.set('n', 'a', api.fs.create, opts('Create'))
46+
vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts('Delete Bookmarked'))
4647
vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked'))
4748
vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer'))
4849
vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy'))

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
local marks = require "nvim-tree.marks"
2+
local utils = require "nvim-tree.utils"
3+
local remove_file = require "nvim-tree.actions.fs.remove-file"
4+
local notify = require "nvim-tree.notify"
5+
local lib = require "nvim-tree.lib"
6+
7+
local M = {
8+
config = {},
9+
}
10+
11+
--- Delete nodes; each removal will be optionally notified
12+
--- @param nodes table
13+
local function do_delete(nodes)
14+
for _, node in pairs(nodes) do
15+
remove_file.remove(node)
16+
end
17+
18+
marks.clear_marks()
19+
20+
if not M.config.filesystem_watchers.enable then
21+
require("nvim-tree.actions.reloaders.reloaders").reload_explorer()
22+
end
23+
end
24+
25+
--- Delete marked nodes, optionally prompting
26+
function M.bulk_delete()
27+
local nodes = marks.get_marks()
28+
if not nodes or #nodes == 0 then
29+
notify.warn "No bookmarksed to delete."
30+
return
31+
end
32+
33+
if M.config.ui.confirm.remove then
34+
local prompt_select = "Remove bookmarked ?"
35+
local prompt_input = prompt_select .. " y/n: "
36+
lib.prompt(prompt_input, prompt_select, { "y", "n" }, { "Yes", "No" }, function(item_short)
37+
utils.clear_prompt()
38+
if item_short == "y" then
39+
do_delete(nodes)
40+
end
41+
end)
42+
else
43+
do_delete(nodes)
44+
end
45+
end
46+
47+
function M.setup(opts)
48+
M.config.ui = opts.ui
49+
M.config.filesystem_watchers = opts.filesystem_watchers
50+
end
51+
52+
return M

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
local Marks = require "nvim-tree.marks"
2-
local Core = require "nvim-tree.core"
1+
local marks = require "nvim-tree.marks"
2+
local core = require "nvim-tree.core"
33
local utils = require "nvim-tree.utils"
4-
local FsRename = require "nvim-tree.actions.fs.rename-file"
4+
local rename_file = require "nvim-tree.actions.fs.rename-file"
55
local notify = require "nvim-tree.notify"
66

77
local M = {
88
config = {},
99
}
1010

1111
function M.bulk_move()
12-
if #Marks.get_marks() == 0 then
13-
notify.warn "no bookmark to perform bulk move on, aborting."
12+
if #marks.get_marks() == 0 then
13+
notify.warn "No bookmarks to move."
1414
return
1515
end
1616

17-
vim.ui.input({ prompt = "Move to: ", default = Core.get_cwd(), completion = "dir" }, function(location)
17+
vim.ui.input({ prompt = "Move to: ", default = core.get_cwd(), completion = "dir" }, function(location)
1818
utils.clear_prompt()
1919
if not location or location == "" then
2020
return
@@ -24,13 +24,15 @@ function M.bulk_move()
2424
return
2525
end
2626

27-
local marks = Marks.get_marks()
28-
for _, node in pairs(marks) do
27+
local nodes = marks.get_marks()
28+
for _, node in pairs(nodes) do
2929
local head = vim.fn.fnamemodify(node.absolute_path, ":t")
3030
local to = utils.path_join { location, head }
31-
FsRename.rename(node, to)
31+
rename_file.rename(node, to)
3232
end
3333

34+
marks.clear_marks()
35+
3436
if not M.config.filesystem_watchers.enable then
3537
require("nvim-tree.actions.reloaders.reloaders").reload_explorer()
3638
end

lua/nvim-tree/marks/init.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ end
7575

7676
function M.setup(opts)
7777
vim.fn.sign_define(SIGN_NAME, { text = opts.renderer.icons.glyphs.bookmark, texthl = "NvimTreeBookmark" })
78+
require("nvim-tree.marks.bulk-delete").setup(opts)
7879
require("nvim-tree.marks.bulk-move").setup(opts)
7980
end
8081

0 commit comments

Comments
 (0)