feat(#1804): add api.marks.bulk.delete with default bd mapping (#2276)

This commit is contained in:
Alexander Courtis 2023-06-18 14:09:11 +10:00 committed by GitHub
parent d4f6d33496
commit bdceaf5096
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 93 additions and 24 deletions

View File

@ -150,6 +150,7 @@ Show the mappings: `g?`
`.` Run Command |nvim-tree-api.node.run.cmd()| `.` Run Command |nvim-tree-api.node.run.cmd()|
`-` Up |nvim-tree-api.tree.change_root_to_parent()| `-` Up |nvim-tree-api.tree.change_root_to_parent()|
`a` Create |nvim-tree-api.fs.create()| `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()| `bmv` Move Bookmarked |nvim-tree-api.marks.bulk.move()|
`B` Toggle No Buffer |nvim-tree-api.tree.toggle_no_buffer_filter()| `B` Toggle No Buffer |nvim-tree-api.tree.toggle_no_buffer_filter()|
`c` Copy |nvim-tree-api.fs.copy.node()| `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()* marks.clear() *nvim-tree-api.marks.clear()*
Clear all marks. 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()* marks.bulk.move() *nvim-tree-api.marks.bulk.move()*
Prompts for a directory to move all marked nodes into. 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.node.run.cmd, opts('Run Command'))
vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up')) 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', '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', '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', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer'))
vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy'))

View File

@ -71,27 +71,33 @@ local function remove_dir(cwd)
return vim.loop.fs_rmdir(cwd) return vim.loop.fs_rmdir(cwd)
end 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) function M.fn(node)
if node.name == ".." then if node.name == ".." then
return return
end end
local function do_remove() local function do_remove()
if node.nodes ~= nil and not node.link_to then M.remove(node)
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.")
if not M.config.filesystem_watchers.enable then if not M.config.filesystem_watchers.enable then
require("nvim-tree.actions.reloaders.reloaders").reload_explorer() require("nvim-tree.actions.reloaders.reloaders").reload_explorer()
end end

View File

@ -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.list = wrap(require("nvim-tree.marks").get_marks)
Api.marks.toggle = wrap_node(require("nvim-tree.marks").toggle_mark) Api.marks.toggle = wrap_node(require("nvim-tree.marks").toggle_mark)
Api.marks.clear = wrap(require("nvim-tree.marks").clear_marks) 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.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.next = wrap(require("nvim-tree.marks.navigation").next)
Api.marks.navigate.prev = wrap(require("nvim-tree.marks.navigation").prev) Api.marks.navigate.prev = wrap(require("nvim-tree.marks.navigation").prev)

View File

@ -100,6 +100,7 @@ local DEFAULT_ON_ATTACH = [[
vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command')) 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', '-', api.tree.change_root_to_parent, opts('Up'))
vim.keymap.set('n', 'a', api.fs.create, opts('Create')) 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', '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', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer'))
vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy'))

View File

@ -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.node.run.cmd, opts('Run Command'))
vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up')) 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', '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', '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', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer'))
vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy'))

View File

@ -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

View File

@ -1,7 +1,7 @@
local Marks = require "nvim-tree.marks" local marks = require "nvim-tree.marks"
local Core = require "nvim-tree.core" local core = require "nvim-tree.core"
local utils = require "nvim-tree.utils" 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 notify = require "nvim-tree.notify"
local M = { local M = {
@ -9,12 +9,12 @@ local M = {
} }
function M.bulk_move() function M.bulk_move()
if #Marks.get_marks() == 0 then if #marks.get_marks() == 0 then
notify.warn "no bookmark to perform bulk move on, aborting." notify.warn "No bookmarks to move."
return return
end 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() utils.clear_prompt()
if not location or location == "" then if not location or location == "" then
return return
@ -24,13 +24,15 @@ function M.bulk_move()
return return
end end
local marks = Marks.get_marks() local nodes = marks.get_marks()
for _, node in pairs(marks) do for _, node in pairs(nodes) do
local head = vim.fn.fnamemodify(node.absolute_path, ":t") local head = vim.fn.fnamemodify(node.absolute_path, ":t")
local to = utils.path_join { location, head } local to = utils.path_join { location, head }
FsRename.rename(node, to) rename_file.rename(node, to)
end end
marks.clear_marks()
if not M.config.filesystem_watchers.enable then if not M.config.filesystem_watchers.enable then
require("nvim-tree.actions.reloaders.reloaders").reload_explorer() require("nvim-tree.actions.reloaders.reloaders").reload_explorer()
end end

View File

@ -75,6 +75,7 @@ end
function M.setup(opts) function M.setup(opts)
vim.fn.sign_define(SIGN_NAME, { text = opts.renderer.icons.glyphs.bookmark, texthl = "NvimTreeBookmark" }) 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) require("nvim-tree.marks.bulk-move").setup(opts)
end end