From 7f7665a17b60d80533b7a69cfad3b6875f2dd453 Mon Sep 17 00:00:00 2001 From: pr4th4m Date: Sat, 16 Sep 2023 15:10:36 +1000 Subject: [PATCH] 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 --- doc/nvim-tree-lua.txt | 5 +++ lua/nvim-tree/actions/fs/trash.lua | 64 ++++++++++++++++-------------- lua/nvim-tree/api.lua | 1 + lua/nvim-tree/keymap.lua | 1 + lua/nvim-tree/marks/bulk-trash.lua | 47 ++++++++++++++++++++++ lua/nvim-tree/marks/init.lua | 1 + 6 files changed, 89 insertions(+), 30 deletions(-) create mode 100644 lua/nvim-tree/marks/bulk-trash.lua diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 6645019e..1a729224 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -156,6 +156,7 @@ Show the mappings: `g?` `-` 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()| +`bt` Trash Bookmarked |nvim-tree-api.marks.bulk.trash()| `bmv` Move Bookmarked |nvim-tree-api.marks.bulk.move()| `B` Toggle Filter: No Buffer |nvim-tree-api.tree.toggle_no_buffer_filter()| `c` Copy |nvim-tree-api.fs.copy.node()| @@ -1899,6 +1900,9 @@ marks.clear() *nvim-tree-api.marks.clear()* marks.bulk.delete() *nvim-tree-api.marks.bulk.delete()* Delete all marked. Optionally prompts. +marks.bulk.trash() *nvim-tree-api.marks.bulk.trash()* + Trash all marked. Optionally prompts. + marks.bulk.move() *nvim-tree-api.marks.bulk.move()* Prompts for a directory to move all marked nodes into. @@ -2047,6 +2051,7 @@ You are encouraged to copy these to your own |nvim-tree.on_attach| function. 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', 'bt', api.marks.bulk.trash, opts('Trash 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 Filter: No Buffer')) vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) diff --git a/lua/nvim-tree/actions/fs/trash.lua b/lua/nvim-tree/actions/fs/trash.lua index 1db48a20..5f82dd20 100644 --- a/lua/nvim-tree/actions/fs/trash.lua +++ b/lua/nvim-tree/actions/fs/trash.lua @@ -24,11 +24,7 @@ local function clear_buffer(absolute_path) end end -function M.fn(node) - if node.name == ".." then - return - end - +function M.remove(node) local binary = M.config.trash.cmd:gsub(" .*$", "") if vim.fn.executable(binary) == 0 then notify.warn(string.format("trash.cmd '%s' is not an executable.", M.config.trash.cmd)) @@ -53,32 +49,40 @@ function M.fn(node) end end + if node.nodes ~= nil and not node.link_to then + trash_path(function(_, rc) + if rc ~= 0 then + notify.warn("trash failed: " .. err_msg .. "; please see :help nvim-tree.trash") + return + end + events._dispatch_folder_removed(node.absolute_path) + if not M.config.filesystem_watchers.enable then + require("nvim-tree.actions.reloaders.reloaders").reload_explorer() + end + end) + else + events._dispatch_will_remove_file(node.absolute_path) + trash_path(function(_, rc) + if rc ~= 0 then + notify.warn("trash failed: " .. err_msg .. "; please see :help nvim-tree.trash") + return + end + events._dispatch_file_removed(node.absolute_path) + clear_buffer(node.absolute_path) + if not M.config.filesystem_watchers.enable then + require("nvim-tree.actions.reloaders.reloaders").reload_explorer() + end + end) + end +end + +function M.fn(node) + if node.name == ".." then + return + end + local function do_trash() - if node.nodes ~= nil and not node.link_to then - trash_path(function(_, rc) - if rc ~= 0 then - notify.warn("trash failed: " .. err_msg .. "; please see :help nvim-tree.trash") - return - end - events._dispatch_folder_removed(node.absolute_path) - if not M.config.filesystem_watchers.enable then - require("nvim-tree.actions.reloaders.reloaders").reload_explorer() - end - end) - else - events._dispatch_will_remove_file(node.absolute_path) - trash_path(function(_, rc) - if rc ~= 0 then - notify.warn("trash failed: " .. err_msg .. "; please see :help nvim-tree.trash") - return - end - events._dispatch_file_removed(node.absolute_path) - clear_buffer(node.absolute_path) - if not M.config.filesystem_watchers.enable then - require("nvim-tree.actions.reloaders.reloaders").reload_explorer() - end - end) - end + M.remove(node) end if M.config.ui.confirm.trash then diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index e708339f..8b11fe5c 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -203,6 +203,7 @@ 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.trash = wrap(require("nvim-tree.marks.bulk-trash").bulk_trash) 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.lua b/lua/nvim-tree/keymap.lua index c5d36f1b..3742fc82 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -44,6 +44,7 @@ function M.default_on_attach(bufnr) 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', 'bt', api.marks.bulk.trash, opts('Trash 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 Filter: No Buffer')) vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) diff --git a/lua/nvim-tree/marks/bulk-trash.lua b/lua/nvim-tree/marks/bulk-trash.lua new file mode 100644 index 00000000..532fb021 --- /dev/null +++ b/lua/nvim-tree/marks/bulk-trash.lua @@ -0,0 +1,47 @@ +local marks = require "nvim-tree.marks" +local utils = require "nvim-tree.utils" +local remove_file = require "nvim-tree.actions.fs.trash" +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_trash(nodes) + for _, node in pairs(nodes) do + remove_file.remove(node) + end + + marks.clear_marks() +end + +function M.bulk_trash() + local nodes = marks.get_marks() + if not nodes or #nodes == 0 then + notify.warn "No bookmarks to trash." + return + end + + if M.config.ui.confirm.trash then + local prompt_select = "Trash bookmarked ?" + local prompt_input = prompt_select .. " y/N: " + lib.prompt(prompt_input, prompt_select, { "", "y" }, { "No", "Yes" }, function(item_short) + utils.clear_prompt() + if item_short == "y" then + do_trash(nodes) + end + end) + else + do_trash(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/init.lua b/lua/nvim-tree/marks/init.lua index f10dbf3a..c3008ebd 100644 --- a/lua/nvim-tree/marks/init.lua +++ b/lua/nvim-tree/marks/init.lua @@ -76,6 +76,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-trash").setup(opts) require("nvim-tree.marks.bulk-move").setup(opts) end