diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index bb2b22821af..f16683e6578 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -150,6 +150,7 @@ Show the mappings: `g?` `.` Run Command |nvim-tree-api.node.run.cmd()| `-` Up |nvim-tree-api.tree.change_root_to_parent()| `a` Create |nvim-tree-api.fs.create()| +`bd` Delete Bookmarked |nvim-tree-api.marks.bulk.delete()| `bmv` Move Bookmarked |nvim-tree-api.marks.bulk.move()| `B` Toggle No Buffer |nvim-tree-api.tree.toggle_no_buffer_filter()| `c` Copy |nvim-tree-api.fs.copy.node()| @@ -1772,6 +1773,9 @@ marks.toggle({node}) *nvim-tree-api.marks.toggle()* marks.clear() *nvim-tree-api.marks.clear()* Clear all marks. +marks.bulk.delete() *nvim-tree-api.marks.bulk.delete()* + Delete all marked. Optionally prompts. + marks.bulk.move() *nvim-tree-api.marks.bulk.move()* Prompts for a directory to move all marked nodes into. @@ -1934,6 +1938,7 @@ You are encouraged to copy these to your own |nvim-tree.on_attach| function. vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command')) vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up')) vim.keymap.set('n', 'a', api.fs.create, opts('Create')) + vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts('Delete Bookmarked')) vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked')) vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer')) vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) diff --git a/lua/nvim-tree/actions/fs/remove-file.lua b/lua/nvim-tree/actions/fs/remove-file.lua index 6b91b1df0a2..a28c916610d 100644 --- a/lua/nvim-tree/actions/fs/remove-file.lua +++ b/lua/nvim-tree/actions/fs/remove-file.lua @@ -71,27 +71,33 @@ local function remove_dir(cwd) return vim.loop.fs_rmdir(cwd) end +--- Remove a node, notify errors, dispatch events +--- @param node table +function M.remove(node) + if node.nodes ~= nil and not node.link_to then + local success = remove_dir(node.absolute_path) + if not success then + return notify.error("Could not remove " .. node.name) + end + events._dispatch_folder_removed(node.absolute_path) + else + local success = vim.loop.fs_unlink(node.absolute_path) + if not success then + return notify.error("Could not remove " .. node.name) + end + events._dispatch_file_removed(node.absolute_path) + clear_buffer(node.absolute_path) + end + notify.info(node.absolute_path .. " was properly removed.") +end + function M.fn(node) if node.name == ".." then return end local function do_remove() - if node.nodes ~= nil and not node.link_to then - local success = remove_dir(node.absolute_path) - if not success then - return notify.error("Could not remove " .. node.name) - end - events._dispatch_folder_removed(node.absolute_path) - else - local success = vim.loop.fs_unlink(node.absolute_path) - if not success then - return notify.error("Could not remove " .. node.name) - end - events._dispatch_file_removed(node.absolute_path) - clear_buffer(node.absolute_path) - end - notify.info(node.absolute_path .. " was properly removed.") + M.remove(node) if not M.config.filesystem_watchers.enable then require("nvim-tree.actions.reloaders.reloaders").reload_explorer() end diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 3905ec16380..fd2f4e5558c 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -202,6 +202,7 @@ Api.marks.get = wrap_node(require("nvim-tree.marks").get_mark) Api.marks.list = wrap(require("nvim-tree.marks").get_marks) Api.marks.toggle = wrap_node(require("nvim-tree.marks").toggle_mark) Api.marks.clear = wrap(require("nvim-tree.marks").clear_marks) +Api.marks.bulk.delete = wrap(require("nvim-tree.marks.bulk-delete").bulk_delete) Api.marks.bulk.move = wrap(require("nvim-tree.marks.bulk-move").bulk_move) Api.marks.navigate.next = wrap(require("nvim-tree.marks.navigation").next) Api.marks.navigate.prev = wrap(require("nvim-tree.marks.navigation").prev) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index a57490a746a..0418515de75 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -100,6 +100,7 @@ local DEFAULT_ON_ATTACH = [[ vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command')) vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up')) vim.keymap.set('n', 'a', api.fs.create, opts('Create')) + vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts('Delete Bookmarked')) vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked')) vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer')) vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 408035c9153..0e1cf14c3f8 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -43,6 +43,7 @@ function M.default_on_attach(bufnr) vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command')) vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up')) vim.keymap.set('n', 'a', api.fs.create, opts('Create')) + vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts('Delete Bookmarked')) vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked')) vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer')) vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) diff --git a/lua/nvim-tree/marks/bulk-delete.lua b/lua/nvim-tree/marks/bulk-delete.lua new file mode 100644 index 00000000000..3dd38ea96e4 --- /dev/null +++ b/lua/nvim-tree/marks/bulk-delete.lua @@ -0,0 +1,52 @@ +local marks = require "nvim-tree.marks" +local utils = require "nvim-tree.utils" +local remove_file = require "nvim-tree.actions.fs.remove-file" +local notify = require "nvim-tree.notify" +local lib = require "nvim-tree.lib" + +local M = { + config = {}, +} + +--- Delete nodes; each removal will be optionally notified +--- @param nodes table +local function do_delete(nodes) + for _, node in pairs(nodes) do + remove_file.remove(node) + end + + marks.clear_marks() + + if not M.config.filesystem_watchers.enable then + require("nvim-tree.actions.reloaders.reloaders").reload_explorer() + end +end + +--- Delete marked nodes, optionally prompting +function M.bulk_delete() + local nodes = marks.get_marks() + if not nodes or #nodes == 0 then + notify.warn "No bookmarksed to delete." + return + end + + if M.config.ui.confirm.remove then + local prompt_select = "Remove bookmarked ?" + local prompt_input = prompt_select .. " y/n: " + lib.prompt(prompt_input, prompt_select, { "y", "n" }, { "Yes", "No" }, function(item_short) + utils.clear_prompt() + if item_short == "y" then + do_delete(nodes) + end + end) + else + do_delete(nodes) + end +end + +function M.setup(opts) + M.config.ui = opts.ui + M.config.filesystem_watchers = opts.filesystem_watchers +end + +return M diff --git a/lua/nvim-tree/marks/bulk-move.lua b/lua/nvim-tree/marks/bulk-move.lua index 9384c21f7f6..84672901277 100644 --- a/lua/nvim-tree/marks/bulk-move.lua +++ b/lua/nvim-tree/marks/bulk-move.lua @@ -1,7 +1,7 @@ -local Marks = require "nvim-tree.marks" -local Core = require "nvim-tree.core" +local marks = require "nvim-tree.marks" +local core = require "nvim-tree.core" local utils = require "nvim-tree.utils" -local FsRename = require "nvim-tree.actions.fs.rename-file" +local rename_file = require "nvim-tree.actions.fs.rename-file" local notify = require "nvim-tree.notify" local M = { @@ -9,12 +9,12 @@ local M = { } function M.bulk_move() - if #Marks.get_marks() == 0 then - notify.warn "no bookmark to perform bulk move on, aborting." + if #marks.get_marks() == 0 then + notify.warn "No bookmarks to move." return end - vim.ui.input({ prompt = "Move to: ", default = Core.get_cwd(), completion = "dir" }, function(location) + vim.ui.input({ prompt = "Move to: ", default = core.get_cwd(), completion = "dir" }, function(location) utils.clear_prompt() if not location or location == "" then return @@ -24,13 +24,15 @@ function M.bulk_move() return end - local marks = Marks.get_marks() - for _, node in pairs(marks) do + local nodes = marks.get_marks() + for _, node in pairs(nodes) do local head = vim.fn.fnamemodify(node.absolute_path, ":t") local to = utils.path_join { location, head } - FsRename.rename(node, to) + rename_file.rename(node, to) end + marks.clear_marks() + if not M.config.filesystem_watchers.enable then require("nvim-tree.actions.reloaders.reloaders").reload_explorer() end diff --git a/lua/nvim-tree/marks/init.lua b/lua/nvim-tree/marks/init.lua index 39c7254a019..07eb899a05d 100644 --- a/lua/nvim-tree/marks/init.lua +++ b/lua/nvim-tree/marks/init.lua @@ -75,6 +75,7 @@ end function M.setup(opts) vim.fn.sign_define(SIGN_NAME, { text = opts.renderer.icons.glyphs.bookmark, texthl = "NvimTreeBookmark" }) + require("nvim-tree.marks.bulk-delete").setup(opts) require("nvim-tree.marks.bulk-move").setup(opts) end