local a = vim.api local M = { config = { is_windows = vim.fn.has('win32') == 1 or vim.fn.has('win32unix') == 1, is_macos = vim.fn.has('mac') == 1 or vim.fn.has('macunix') == 1, is_unix = vim.fn.has('unix') == 1, } } local lib = require'nvim-tree.lib' local utils = require'nvim-tree.utils' local events = require'nvim-tree.events' local function clear_buffer(absolute_path) local bufs = vim.fn.getbufinfo({bufloaded = 1, buflisted = 1}) for _, buf in pairs(bufs) do if buf.name == absolute_path then if buf.hidden == 0 and #bufs > 1 then local winnr = a.nvim_get_current_win() a.nvim_set_current_win(buf.windows[1]) vim.cmd(':bn') a.nvim_set_current_win(winnr) end vim.api.nvim_buf_delete(buf.bufnr, {}) return end end end function M.trash_node(node) if node.name == '..' then return end -- configs if M.config.is_unix then if M.config.trash.cmd == nil then M.config.trash.cmd = 'trash' end if M.config.trash.require_confirm == nil then M.config.trash.require_confirm = true end else utils.warn('Trash is currently a UNIX only feature!') return end -- trashes a path (file or folder) local function trash_path(on_exit) vim.fn.jobstart(M.config.trash.cmd.." "..node.absolute_path, { detach = true, on_exit = on_exit, }) end local is_confirmed = true -- confirmation prompt if M.config.trash.require_confirm then is_confirmed = false print("Trash " ..node.name.. " ? y/n") local ans = utils.get_user_input_char() if ans:match('^y') then is_confirmed = true end utils.clear_prompt() end -- trashing if is_confirmed then if node.entries ~= nil and not node.link_to then trash_path(function() events._dispatch_folder_removed(node.absolute_path) lib.refresh_tree() end) else trash_path(function() events._dispatch_file_removed(node.absolute_path) clear_buffer(node.absolute_path) lib.refresh_tree() end) end end end function M.setup(opts) M.config.trash = opts or {} end return M