diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 4ef9b1c340a..b9d1bb4c1c3 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1894,7 +1894,7 @@ tree.winid({opts}) *nvim-tree-api.tree.winid()* • {opts} (table) optional parameters Options: ~ - • {tabpage} (number|nil) tabpage, 0 or nil for current, default nil + • {tabpage} (number|nil) tabpage, 0 or nil for current, default nil Return: ~ (number) winid or nil if tree is not visible @@ -2164,6 +2164,28 @@ node.run.cmd({node}) *nvim-tree-api.node.run.cmd()* node.run.system({node}) *nvim-tree-api.node.run.system()* Execute |nvim-tree.system_open| +node.buffer.delete({node}, {opts}) *nvim-tree-api.node.buffer.delete()* + Deletes node's related buffer, if one exists. + Executes |:bdelete| or |:bdelete|! + + Parameters: ~ + • {node} (Node|nil) file or folder + • {opts} (table) optional parameters + + Options: ~ + • {force} (boolean) delete even if buffer is modified, default false + +node.buffer.wipe({node}, {opts}) *nvim-tree-api.node.buffer.wipe()* + Wipes node's related buffer, if one exists. + Executes |:bwipe| or |:bwipe|! + + Parameters: ~ + • {node} (Node|nil) file or folder + • {opts} (table) optional parameters + + Options: ~ + • {force} (boolean) wipe even if buffer is modified, default false + ============================================================================== 6.4 API GIT *nvim-tree-api.git* @@ -3178,6 +3200,8 @@ highlight group is not, hard linking as follows: > |nvim-tree-api.marks.navigate.prev()| |nvim-tree-api.marks.navigate.select()| |nvim-tree-api.marks.toggle()| +|nvim-tree-api.node.buffer.delete()| +|nvim-tree-api.node.buffer.wipe()| |nvim-tree-api.node.navigate.diagnostics.next()| |nvim-tree-api.node.navigate.diagnostics.next_recursive()| |nvim-tree-api.node.navigate.diagnostics.prev()| diff --git a/lua/nvim-tree/actions/node/buffer.lua b/lua/nvim-tree/actions/node/buffer.lua new file mode 100644 index 00000000000..425fcfa4ba6 --- /dev/null +++ b/lua/nvim-tree/actions/node/buffer.lua @@ -0,0 +1,58 @@ +-- Copyright 2019 Yazdani Kiyan under MIT License +local notify = require("nvim-tree.notify") + +local M = {} + +---@param node Node +---@param opts ApiNodeDeleteWipeBufferOpts|nil +---@return nil +function M.delete(node, opts) + M.delete_buffer("delete", node.absolute_path, opts) +end + +---@param node Node +---@param opts ApiNodeDeleteWipeBufferOpts|nil +---@return nil +function M.wipe(node, opts) + M.delete_buffer("wipe", node.absolute_path, opts) +end + +---@alias ApiNodeDeleteWipeBufferMode '"delete"'|'"wipe"' + +---@param mode ApiNodeDeleteWipeBufferMode +---@param filename string +---@param opts ApiNodeDeleteWipeBufferOpts|nil +---@return nil +function M.delete_buffer(mode, filename, opts) + if type(mode) ~= "string" then + mode = "delete" + end + + local buf_fn = vim.cmd.bdelete + if mode == "wipe" then + buf_fn = vim.cmd.bwipe + end + + opts = opts or { force = false } + + local notify_node = notify.render_path(filename) + + -- check if buffer for file at cursor exists and if it is loaded + local bufnr_at_filename = vim.fn.bufnr(filename) + if bufnr_at_filename == -1 or vim.fn.getbufinfo(bufnr_at_filename)[1].loaded == 0 then + notify.info("No loaded buffer coincides with " .. notify_node) + return + end + + local force = opts.force + -- check if buffer is modified + local buf_modified = vim.fn.getbufinfo(bufnr_at_filename)[1].changed + if not force and buf_modified == 1 then + notify.error("Buffer for file " .. notify_node .. " is modified") + return + end + + buf_fn({ filename, bang = force }) +end + +return M diff --git a/lua/nvim-tree/actions/node/init.lua b/lua/nvim-tree/actions/node/init.lua index f82ad4ae38d..f7075959b5e 100644 --- a/lua/nvim-tree/actions/node/init.lua +++ b/lua/nvim-tree/actions/node/init.lua @@ -4,6 +4,7 @@ M.file_popup = require("nvim-tree.actions.node.file-popup") M.open_file = require("nvim-tree.actions.node.open-file") M.run_command = require("nvim-tree.actions.node.run-command") M.system_open = require("nvim-tree.actions.node.system-open") +M.buffer = require("nvim-tree.actions.node.buffer") function M.setup(opts) require("nvim-tree.actions.node.system-open").setup(opts) diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index e6c3d5b7cac..748768dce58 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -24,6 +24,7 @@ local Api = { }, run = {}, open = {}, + buffer = {}, }, events = {}, marks = { @@ -286,6 +287,16 @@ Api.node.navigate.diagnostics.prev_recursive = wrap_node(actions.moves.item.fn({ Api.node.navigate.opened.next = wrap_node(actions.moves.item.fn({ where = "next", what = "opened" })) Api.node.navigate.opened.prev = wrap_node(actions.moves.item.fn({ where = "prev", what = "opened" })) +---@class ApiNodeDeleteWipeBufferOpts +---@field force boolean|nil default false + +Api.node.buffer.delete = wrap_node(function(node, opts) + actions.node.buffer.delete(node, opts) +end) +Api.node.buffer.wipe = wrap_node(function(node, opts) + actions.node.buffer.wipe(node, opts) +end) + Api.git.reload = wrap_explorer("reload_git") Api.events.subscribe = events.subscribe