Skip to content

Commit 7f7665a

Browse files
pr4th4malex-courtis
andauthored
feat: api.marks.bulk.trash (#2391)
* Feature: Bulk trash api * Update docs * Follow documentation syntax * Remove unnecessary refresh * doc spacing --------- Co-authored-by: Alexander Courtis <[email protected]>
1 parent 94c7c81 commit 7f7665a

File tree

6 files changed

+89
-30
lines changed

6 files changed

+89
-30
lines changed

doc/nvim-tree-lua.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ Show the mappings: `g?`
156156
`-` Up |nvim-tree-api.tree.change_root_to_parent()|
157157
`a` Create |nvim-tree-api.fs.create()|
158158
`bd` Delete Bookmarked |nvim-tree-api.marks.bulk.delete()|
159+
`bt` Trash Bookmarked |nvim-tree-api.marks.bulk.trash()|
159160
`bmv` Move Bookmarked |nvim-tree-api.marks.bulk.move()|
160161
`B` Toggle Filter: No Buffer |nvim-tree-api.tree.toggle_no_buffer_filter()|
161162
`c` Copy |nvim-tree-api.fs.copy.node()|
@@ -1899,6 +1900,9 @@ marks.clear() *nvim-tree-api.marks.clear()*
18991900
marks.bulk.delete() *nvim-tree-api.marks.bulk.delete()*
19001901
Delete all marked. Optionally prompts.
19011902

1903+
marks.bulk.trash() *nvim-tree-api.marks.bulk.trash()*
1904+
Trash all marked. Optionally prompts.
1905+
19021906
marks.bulk.move() *nvim-tree-api.marks.bulk.move()*
19031907
Prompts for a directory to move all marked nodes into.
19041908

@@ -2047,6 +2051,7 @@ You are encouraged to copy these to your own |nvim-tree.on_attach| function.
20472051
vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up'))
20482052
vim.keymap.set('n', 'a', api.fs.create, opts('Create'))
20492053
vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts('Delete Bookmarked'))
2054+
vim.keymap.set('n', 'bt', api.marks.bulk.trash, opts('Trash Bookmarked'))
20502055
vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked'))
20512056
vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle Filter: No Buffer'))
20522057
vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy'))

lua/nvim-tree/actions/fs/trash.lua

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,7 @@ local function clear_buffer(absolute_path)
2424
end
2525
end
2626

27-
function M.fn(node)
28-
if node.name == ".." then
29-
return
30-
end
31-
27+
function M.remove(node)
3228
local binary = M.config.trash.cmd:gsub(" .*$", "")
3329
if vim.fn.executable(binary) == 0 then
3430
notify.warn(string.format("trash.cmd '%s' is not an executable.", M.config.trash.cmd))
@@ -53,32 +49,40 @@ function M.fn(node)
5349
end
5450
end
5551

52+
if node.nodes ~= nil and not node.link_to then
53+
trash_path(function(_, rc)
54+
if rc ~= 0 then
55+
notify.warn("trash failed: " .. err_msg .. "; please see :help nvim-tree.trash")
56+
return
57+
end
58+
events._dispatch_folder_removed(node.absolute_path)
59+
if not M.config.filesystem_watchers.enable then
60+
require("nvim-tree.actions.reloaders.reloaders").reload_explorer()
61+
end
62+
end)
63+
else
64+
events._dispatch_will_remove_file(node.absolute_path)
65+
trash_path(function(_, rc)
66+
if rc ~= 0 then
67+
notify.warn("trash failed: " .. err_msg .. "; please see :help nvim-tree.trash")
68+
return
69+
end
70+
events._dispatch_file_removed(node.absolute_path)
71+
clear_buffer(node.absolute_path)
72+
if not M.config.filesystem_watchers.enable then
73+
require("nvim-tree.actions.reloaders.reloaders").reload_explorer()
74+
end
75+
end)
76+
end
77+
end
78+
79+
function M.fn(node)
80+
if node.name == ".." then
81+
return
82+
end
83+
5684
local function do_trash()
57-
if node.nodes ~= nil and not node.link_to then
58-
trash_path(function(_, rc)
59-
if rc ~= 0 then
60-
notify.warn("trash failed: " .. err_msg .. "; please see :help nvim-tree.trash")
61-
return
62-
end
63-
events._dispatch_folder_removed(node.absolute_path)
64-
if not M.config.filesystem_watchers.enable then
65-
require("nvim-tree.actions.reloaders.reloaders").reload_explorer()
66-
end
67-
end)
68-
else
69-
events._dispatch_will_remove_file(node.absolute_path)
70-
trash_path(function(_, rc)
71-
if rc ~= 0 then
72-
notify.warn("trash failed: " .. err_msg .. "; please see :help nvim-tree.trash")
73-
return
74-
end
75-
events._dispatch_file_removed(node.absolute_path)
76-
clear_buffer(node.absolute_path)
77-
if not M.config.filesystem_watchers.enable then
78-
require("nvim-tree.actions.reloaders.reloaders").reload_explorer()
79-
end
80-
end)
81-
end
85+
M.remove(node)
8286
end
8387

8488
if M.config.ui.confirm.trash then

lua/nvim-tree/api.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ 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)
205205
Api.marks.bulk.delete = wrap(require("nvim-tree.marks.bulk-delete").bulk_delete)
206+
Api.marks.bulk.trash = wrap(require("nvim-tree.marks.bulk-trash").bulk_trash)
206207
Api.marks.bulk.move = wrap(require("nvim-tree.marks.bulk-move").bulk_move)
207208
Api.marks.navigate.next = wrap(require("nvim-tree.marks.navigation").next)
208209
Api.marks.navigate.prev = wrap(require("nvim-tree.marks.navigation").prev)

lua/nvim-tree/keymap.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ function M.default_on_attach(bufnr)
4444
vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up'))
4545
vim.keymap.set('n', 'a', api.fs.create, opts('Create'))
4646
vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts('Delete Bookmarked'))
47+
vim.keymap.set('n', 'bt', api.marks.bulk.trash, opts('Trash Bookmarked'))
4748
vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked'))
4849
vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle Filter: No Buffer'))
4950
vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy'))

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
local marks = require "nvim-tree.marks"
2+
local utils = require "nvim-tree.utils"
3+
local remove_file = require "nvim-tree.actions.fs.trash"
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_trash(nodes)
14+
for _, node in pairs(nodes) do
15+
remove_file.remove(node)
16+
end
17+
18+
marks.clear_marks()
19+
end
20+
21+
function M.bulk_trash()
22+
local nodes = marks.get_marks()
23+
if not nodes or #nodes == 0 then
24+
notify.warn "No bookmarks to trash."
25+
return
26+
end
27+
28+
if M.config.ui.confirm.trash then
29+
local prompt_select = "Trash bookmarked ?"
30+
local prompt_input = prompt_select .. " y/N: "
31+
lib.prompt(prompt_input, prompt_select, { "", "y" }, { "No", "Yes" }, function(item_short)
32+
utils.clear_prompt()
33+
if item_short == "y" then
34+
do_trash(nodes)
35+
end
36+
end)
37+
else
38+
do_trash(nodes)
39+
end
40+
end
41+
42+
function M.setup(opts)
43+
M.config.ui = opts.ui
44+
M.config.filesystem_watchers = opts.filesystem_watchers
45+
end
46+
47+
return M

lua/nvim-tree/marks/init.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ end
7676
function M.setup(opts)
7777
vim.fn.sign_define(SIGN_NAME, { text = opts.renderer.icons.glyphs.bookmark, texthl = "NvimTreeBookmark" })
7878
require("nvim-tree.marks.bulk-delete").setup(opts)
79+
require("nvim-tree.marks.bulk-trash").setup(opts)
7980
require("nvim-tree.marks.bulk-move").setup(opts)
8081
end
8182

0 commit comments

Comments
 (0)