From 71451eabebb34afc6144b2311eec42dc2714862c Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Fri, 27 Dec 2024 23:39:05 -0300 Subject: [PATCH 01/15] feat(mappings): add key map to close file buffer --- lua/nvim-tree/keymap.lua | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 94029de5818..36baa331517 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -1,3 +1,4 @@ +local notify = require("nvim-tree.notify") local M = {} --- Apply mappings to a scratch buffer and return buffer local mappings @@ -44,13 +45,23 @@ function M.default_on_attach(bufnr) end -- BEGIN_DEFAULT_ON_ATTACH - vim.keymap.set("n", "", api.tree.change_root_to_node, opts("CD")) - vim.keymap.set("n", "", api.node.open.replace_tree_buffer, opts("Open: In Place")) - vim.keymap.set("n", "", api.node.show_info_popup, opts("Info")) - vim.keymap.set("n", "", api.fs.rename_sub, opts("Rename: Omit Filename")) - vim.keymap.set("n", "", api.node.open.tab, opts("Open: New Tab")) - vim.keymap.set("n", "", api.node.open.vertical, opts("Open: Vertical Split")) - vim.keymap.set("n", "", api.node.open.horizontal, opts("Open: Horizontal Split")) + vim.keymap.set("n", "", api.tree.change_root_to_node, opts("CD")) + vim.keymap.set("n", "", api.node.open.replace_tree_buffer, opts("Open: In Place")) + vim.keymap.set("n", "", api.node.show_info_popup, opts("Info")) + vim.keymap.set("n", "", api.fs.rename_sub, opts("Rename: Omit Filename")) + vim.keymap.set("n", "", api.node.open.tab, opts("Open: New Tab")) + vim.keymap.set("n", "", api.node.open.vertical, opts("Open: Vertical Split")) + vim.keymap.set("n", "", api.node.open.horizontal, opts("Open: Horizontal Split")) + vim.keymap.set("n", "", function() + local filename = require("nvim-tree.api").tree.get_node_under_cursor().absolute_path + local buffer_at_filename = vim.fn.bufnr(filename) + if buffer_at_filename == -1 then + notify.error(string.format("No buffer coincides with %s", filename)) + return + end + + vim.cmd({ cmd = "bdelete", args = { filename } }) + end, opts("Close file buffer (if any exist)")) vim.keymap.set("n", "", api.node.navigate.parent_close, opts("Close Directory")) vim.keymap.set("n", "", api.node.open.edit, opts("Open")) vim.keymap.set("n", "", api.node.open.preview, opts("Open Preview")) From c72de8c171dd26a0c506490a3eed67422a3f1544 Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Mon, 30 Dec 2024 16:23:16 -0300 Subject: [PATCH 02/15] feat: implement Api.node.buffer.delete --- lua/nvim-tree.lua | 1 + lua/nvim-tree/actions/node/delete-buffer.lua | 35 ++++++++++++++++++++ lua/nvim-tree/actions/node/init.lua | 2 ++ lua/nvim-tree/api.lua | 10 +++++- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 lua/nvim-tree/actions/node/delete-buffer.lua diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 09b5bacd90d..cf958d09940 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -470,6 +470,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS remove_file = { close_window = true, }, + delete_buffer = {}, }, trash = { cmd = "gio trash", diff --git a/lua/nvim-tree/actions/node/delete-buffer.lua b/lua/nvim-tree/actions/node/delete-buffer.lua new file mode 100644 index 00000000000..c090f3cbf8a --- /dev/null +++ b/lua/nvim-tree/actions/node/delete-buffer.lua @@ -0,0 +1,35 @@ +-- Copyright 2019 Yazdani Kiyan under MIT License +local notify = require("nvim-tree.notify") + +local M = {} + +---@param filename string +---@param opts ApiNodeDeleteBufferOpts|nil +---@return nil +function M.fn(filename, opts) + 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.error("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 + + vim.cmd.bdelete({ filename, bang = force }) +end + +function M.setup(opts) +end + +return M diff --git a/lua/nvim-tree/actions/node/init.lua b/lua/nvim-tree/actions/node/init.lua index f82ad4ae38d..094d36d8692 100644 --- a/lua/nvim-tree/actions/node/init.lua +++ b/lua/nvim-tree/actions/node/init.lua @@ -4,11 +4,13 @@ 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.delete_buffer = require("nvim-tree.actions.node.delete-buffer") function M.setup(opts) require("nvim-tree.actions.node.system-open").setup(opts) require("nvim-tree.actions.node.file-popup").setup(opts) require("nvim-tree.actions.node.open-file").setup(opts) + require("nvim-tree.actions.node.delete-buffer").setup(opts) end return M diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index e6c3d5b7cac..076daccb9a3 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -24,6 +24,7 @@ local Api = { }, run = {}, open = {}, + buffer = {}, }, events = {}, marks = { @@ -131,7 +132,7 @@ end Api.tree.open = wrap(actions.tree.open.fn) Api.tree.focus = Api.tree.open ----@class ApiTreeToggleOpts +---@class ApiTreeToggleOptsApiTreeTo ---@field path string|nil ---@field current_window boolean|nil default false ---@field winid number|nil @@ -286,6 +287,13 @@ 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 ApiNodeDeleteBufferOpts +---@field force boolean|nil default false + +Api.node.buffer.delete = wrap_node(function (node, opts) + actions.node.delete_buffer.fn(node.absolute_path, opts) +end) + Api.git.reload = wrap_explorer("reload_git") Api.events.subscribe = events.subscribe From 6de852616c332087eee2ef368a02d0447dca19bd Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Mon, 30 Dec 2024 16:51:42 -0300 Subject: [PATCH 03/15] feat: implement Api.node.buffer.wipe --- lua/nvim-tree/actions/node/init.lua | 2 ++ lua/nvim-tree/actions/node/wipe-buffer.lua | 35 ++++++++++++++++++++++ lua/nvim-tree/api.lua | 5 ++++ 3 files changed, 42 insertions(+) create mode 100644 lua/nvim-tree/actions/node/wipe-buffer.lua diff --git a/lua/nvim-tree/actions/node/init.lua b/lua/nvim-tree/actions/node/init.lua index 094d36d8692..2eb7de8d20a 100644 --- a/lua/nvim-tree/actions/node/init.lua +++ b/lua/nvim-tree/actions/node/init.lua @@ -5,12 +5,14 @@ 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.delete_buffer = require("nvim-tree.actions.node.delete-buffer") +M.wipe_buffer = require("nvim-tree.actions.node.wipe-buffer") function M.setup(opts) require("nvim-tree.actions.node.system-open").setup(opts) require("nvim-tree.actions.node.file-popup").setup(opts) require("nvim-tree.actions.node.open-file").setup(opts) require("nvim-tree.actions.node.delete-buffer").setup(opts) + require("nvim-tree.actions.node.wipe-buffer").setup(opts) end return M diff --git a/lua/nvim-tree/actions/node/wipe-buffer.lua b/lua/nvim-tree/actions/node/wipe-buffer.lua new file mode 100644 index 00000000000..393ac43bbdc --- /dev/null +++ b/lua/nvim-tree/actions/node/wipe-buffer.lua @@ -0,0 +1,35 @@ +-- Copyright 2019 Yazdani Kiyan under MIT License +local notify = require("nvim-tree.notify") + +local M = {} + +---@param filename string +---@param opts ApiNodeDeleteBufferOpts|nil +---@return nil +function M.fn(filename, opts) + 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.error("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 + + vim.cmd.bwipe({ filename, bang = force }) +end + +function M.setup(opts) +end + +return M diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 076daccb9a3..2e3ab916408 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -289,10 +289,15 @@ Api.node.navigate.opened.prev = wrap_node(actions.moves.item.fn({ where = "prev" ---@class ApiNodeDeleteBufferOpts ---@field force boolean|nil default false +---@class ApiNodeWipeBufferOpts +---@field force boolean|nil default false Api.node.buffer.delete = wrap_node(function (node, opts) actions.node.delete_buffer.fn(node.absolute_path, opts) end) +Api.node.buffer.wipe = wrap_node(function (node, opts) + actions.node.wipe_buffer.fn(node.absolute_path, opts) +end) Api.git.reload = wrap_explorer("reload_git") From 33ff62a1efc8b9d4889d296f706f3f2c6a34c16c Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Mon, 30 Dec 2024 17:22:48 -0300 Subject: [PATCH 04/15] refactor: add util fn for common delete ops on bufs --- lua/nvim-tree/actions/node/delete-buffer.lua | 25 ++--------- lua/nvim-tree/actions/node/utils.lua | 44 ++++++++++++++++++++ lua/nvim-tree/actions/node/wipe-buffer.lua | 25 ++--------- lua/nvim-tree/api.lua | 4 +- 4 files changed, 51 insertions(+), 47 deletions(-) create mode 100644 lua/nvim-tree/actions/node/utils.lua diff --git a/lua/nvim-tree/actions/node/delete-buffer.lua b/lua/nvim-tree/actions/node/delete-buffer.lua index c090f3cbf8a..25cba8ceac3 100644 --- a/lua/nvim-tree/actions/node/delete-buffer.lua +++ b/lua/nvim-tree/actions/node/delete-buffer.lua @@ -1,32 +1,13 @@ -- Copyright 2019 Yazdani Kiyan under MIT License -local notify = require("nvim-tree.notify") +local utils = require("nvim-tree.actions.node.utils") local M = {} ---@param filename string ----@param opts ApiNodeDeleteBufferOpts|nil +---@param opts ApiNodeDeleteWipeBufferOpts|nil ---@return nil function M.fn(filename, opts) - 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.error("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 - - vim.cmd.bdelete({ filename, bang = force }) + utils.delete_buffer("delete", filename, opts) end function M.setup(opts) diff --git a/lua/nvim-tree/actions/node/utils.lua b/lua/nvim-tree/actions/node/utils.lua new file mode 100644 index 00000000000..950321ed876 --- /dev/null +++ b/lua/nvim-tree/actions/node/utils.lua @@ -0,0 +1,44 @@ +-- Copyright 2019 Yazdani Kiyan under MIT License +local notify = require("nvim-tree.notify") + +local M = {} + +---@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.error("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/wipe-buffer.lua b/lua/nvim-tree/actions/node/wipe-buffer.lua index 393ac43bbdc..88839bf4e24 100644 --- a/lua/nvim-tree/actions/node/wipe-buffer.lua +++ b/lua/nvim-tree/actions/node/wipe-buffer.lua @@ -1,32 +1,13 @@ -- Copyright 2019 Yazdani Kiyan under MIT License -local notify = require("nvim-tree.notify") +local utils = require("nvim-tree.actions.node.utils") local M = {} ---@param filename string ----@param opts ApiNodeDeleteBufferOpts|nil +---@param opts ApiNodeDeleteWipeBufferOpts|nil ---@return nil function M.fn(filename, opts) - 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.error("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 - - vim.cmd.bwipe({ filename, bang = force }) + utils.delete_buffer("wipe", filename, opts) end function M.setup(opts) diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 2e3ab916408..5d9e40be100 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -287,9 +287,7 @@ 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 ApiNodeDeleteBufferOpts ----@field force boolean|nil default false ----@class ApiNodeWipeBufferOpts +---@class ApiNodeDeleteWipeBufferOpts ---@field force boolean|nil default false Api.node.buffer.delete = wrap_node(function (node, opts) From e645b5f2048514032595093bf2340e391ceb882c Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Mon, 30 Dec 2024 17:32:04 -0300 Subject: [PATCH 05/15] fix: minor fixes --- lua/nvim-tree.lua | 1 + lua/nvim-tree/keymap.lua | 25 +++++++------------------ 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index cf958d09940..a3083d1c375 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -471,6 +471,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS close_window = true, }, delete_buffer = {}, + wipe_buffer = {}, }, trash = { cmd = "gio trash", diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 36baa331517..94029de5818 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -1,4 +1,3 @@ -local notify = require("nvim-tree.notify") local M = {} --- Apply mappings to a scratch buffer and return buffer local mappings @@ -45,23 +44,13 @@ function M.default_on_attach(bufnr) end -- BEGIN_DEFAULT_ON_ATTACH - vim.keymap.set("n", "", api.tree.change_root_to_node, opts("CD")) - vim.keymap.set("n", "", api.node.open.replace_tree_buffer, opts("Open: In Place")) - vim.keymap.set("n", "", api.node.show_info_popup, opts("Info")) - vim.keymap.set("n", "", api.fs.rename_sub, opts("Rename: Omit Filename")) - vim.keymap.set("n", "", api.node.open.tab, opts("Open: New Tab")) - vim.keymap.set("n", "", api.node.open.vertical, opts("Open: Vertical Split")) - vim.keymap.set("n", "", api.node.open.horizontal, opts("Open: Horizontal Split")) - vim.keymap.set("n", "", function() - local filename = require("nvim-tree.api").tree.get_node_under_cursor().absolute_path - local buffer_at_filename = vim.fn.bufnr(filename) - if buffer_at_filename == -1 then - notify.error(string.format("No buffer coincides with %s", filename)) - return - end - - vim.cmd({ cmd = "bdelete", args = { filename } }) - end, opts("Close file buffer (if any exist)")) + vim.keymap.set("n", "", api.tree.change_root_to_node, opts("CD")) + vim.keymap.set("n", "", api.node.open.replace_tree_buffer, opts("Open: In Place")) + vim.keymap.set("n", "", api.node.show_info_popup, opts("Info")) + vim.keymap.set("n", "", api.fs.rename_sub, opts("Rename: Omit Filename")) + vim.keymap.set("n", "", api.node.open.tab, opts("Open: New Tab")) + vim.keymap.set("n", "", api.node.open.vertical, opts("Open: Vertical Split")) + vim.keymap.set("n", "", api.node.open.horizontal, opts("Open: Horizontal Split")) vim.keymap.set("n", "", api.node.navigate.parent_close, opts("Close Directory")) vim.keymap.set("n", "", api.node.open.edit, opts("Open")) vim.keymap.set("n", "", api.node.open.preview, opts("Open Preview")) From 404aae7efbf45687feb85bdebcec19e2fe7a42f6 Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Mon, 30 Dec 2024 22:55:23 -0300 Subject: [PATCH 06/15] refactor: fix lint issues --- lua/nvim-tree/actions/node/delete-buffer.lua | 2 +- lua/nvim-tree/actions/node/wipe-buffer.lua | 2 +- lua/nvim-tree/api.lua | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/nvim-tree/actions/node/delete-buffer.lua b/lua/nvim-tree/actions/node/delete-buffer.lua index 25cba8ceac3..59df2b834b9 100644 --- a/lua/nvim-tree/actions/node/delete-buffer.lua +++ b/lua/nvim-tree/actions/node/delete-buffer.lua @@ -10,7 +10,7 @@ function M.fn(filename, opts) utils.delete_buffer("delete", filename, opts) end -function M.setup(opts) +function M.setup(_) end return M diff --git a/lua/nvim-tree/actions/node/wipe-buffer.lua b/lua/nvim-tree/actions/node/wipe-buffer.lua index 88839bf4e24..b7c5007cd8e 100644 --- a/lua/nvim-tree/actions/node/wipe-buffer.lua +++ b/lua/nvim-tree/actions/node/wipe-buffer.lua @@ -10,7 +10,7 @@ function M.fn(filename, opts) utils.delete_buffer("wipe", filename, opts) end -function M.setup(opts) +function M.setup(_) end return M diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 5d9e40be100..08f6363e3fa 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -290,10 +290,10 @@ Api.node.navigate.opened.prev = wrap_node(actions.moves.item.fn({ where = "prev" ---@class ApiNodeDeleteWipeBufferOpts ---@field force boolean|nil default false -Api.node.buffer.delete = wrap_node(function (node, opts) +Api.node.buffer.delete = wrap_node(function(node, opts) actions.node.delete_buffer.fn(node.absolute_path, opts) end) -Api.node.buffer.wipe = wrap_node(function (node, opts) +Api.node.buffer.wipe = wrap_node(function(node, opts) actions.node.wipe_buffer.fn(node.absolute_path, opts) end) From 2719542c17b6f6718d95265763b072d13c406768 Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Tue, 14 Jan 2025 22:35:02 -0300 Subject: [PATCH 07/15] fix: undo unintended ApiTreeToggleOpts change --- lua/nvim-tree/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 08f6363e3fa..f5cd9632277 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -132,7 +132,7 @@ end Api.tree.open = wrap(actions.tree.open.fn) Api.tree.focus = Api.tree.open ----@class ApiTreeToggleOptsApiTreeTo +---@class ApiTreeToggleOpts ---@field path string|nil ---@field current_window boolean|nil default false ---@field winid number|nil From 6e598f3cbdef231fc17d9d7485d9071471e92a12 Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Fri, 17 Jan 2025 22:40:30 -0300 Subject: [PATCH 08/15] fix: change error message level to info --- lua/nvim-tree/actions/node/utils.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/nvim-tree/actions/node/utils.lua b/lua/nvim-tree/actions/node/utils.lua index 950321ed876..54a5d283037 100644 --- a/lua/nvim-tree/actions/node/utils.lua +++ b/lua/nvim-tree/actions/node/utils.lua @@ -26,7 +26,7 @@ function M.delete_buffer(mode, filename, opts) -- 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.error("No loaded buffer coincides with " .. notify_node) + notify.info("No loaded buffer coincides with " .. notify_node) return end From c87c193b02bc36e20dd69bd620a641bb4c01309a Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Fri, 17 Jan 2025 22:43:52 -0300 Subject: [PATCH 09/15] fix: remove unused opts --- lua/nvim-tree.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index a3083d1c375..09b5bacd90d 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -470,8 +470,6 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS remove_file = { close_window = true, }, - delete_buffer = {}, - wipe_buffer = {}, }, trash = { cmd = "gio trash", From 343b8a09e664d4e4104502fb0b180511d1f301b9 Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Fri, 17 Jan 2025 23:16:07 -0300 Subject: [PATCH 10/15] refactor: merge delete-buffer and wipe-buffer into single buffer file --- lua/nvim-tree/actions/node/buffer.lua | 61 ++++++++++++++++++++ lua/nvim-tree/actions/node/delete-buffer.lua | 16 ----- lua/nvim-tree/actions/node/init.lua | 6 +- lua/nvim-tree/actions/node/wipe-buffer.lua | 16 ----- lua/nvim-tree/api.lua | 4 +- 5 files changed, 65 insertions(+), 38 deletions(-) create mode 100644 lua/nvim-tree/actions/node/buffer.lua delete mode 100644 lua/nvim-tree/actions/node/delete-buffer.lua delete mode 100644 lua/nvim-tree/actions/node/wipe-buffer.lua diff --git a/lua/nvim-tree/actions/node/buffer.lua b/lua/nvim-tree/actions/node/buffer.lua new file mode 100644 index 00000000000..d256ffbfc26 --- /dev/null +++ b/lua/nvim-tree/actions/node/buffer.lua @@ -0,0 +1,61 @@ +-- Copyright 2019 Yazdani Kiyan under MIT License +local notify = require("nvim-tree.notify") + +local M = {} + +---@param filename string +---@param opts ApiNodeDeleteWipeBufferOpts|nil +---@return nil +function M.delete(filename, opts) + M.delete_buffer("delete", filename, opts) +end + +---@param filename string +---@param opts ApiNodeDeleteWipeBufferOpts|nil +---@return nil +function M.wipe(filename, opts) + M.delete_buffer("wipe", filename, 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 + +function M.setup(_) +end + +return M diff --git a/lua/nvim-tree/actions/node/delete-buffer.lua b/lua/nvim-tree/actions/node/delete-buffer.lua deleted file mode 100644 index 59df2b834b9..00000000000 --- a/lua/nvim-tree/actions/node/delete-buffer.lua +++ /dev/null @@ -1,16 +0,0 @@ --- Copyright 2019 Yazdani Kiyan under MIT License -local utils = require("nvim-tree.actions.node.utils") - -local M = {} - ----@param filename string ----@param opts ApiNodeDeleteWipeBufferOpts|nil ----@return nil -function M.fn(filename, opts) - utils.delete_buffer("delete", filename, opts) -end - -function M.setup(_) -end - -return M diff --git a/lua/nvim-tree/actions/node/init.lua b/lua/nvim-tree/actions/node/init.lua index 2eb7de8d20a..3dac4eac5b3 100644 --- a/lua/nvim-tree/actions/node/init.lua +++ b/lua/nvim-tree/actions/node/init.lua @@ -4,15 +4,13 @@ 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.delete_buffer = require("nvim-tree.actions.node.delete-buffer") -M.wipe_buffer = require("nvim-tree.actions.node.wipe-buffer") +M.buffer = require("nvim-tree.actions.node.buffer") function M.setup(opts) require("nvim-tree.actions.node.system-open").setup(opts) require("nvim-tree.actions.node.file-popup").setup(opts) require("nvim-tree.actions.node.open-file").setup(opts) - require("nvim-tree.actions.node.delete-buffer").setup(opts) - require("nvim-tree.actions.node.wipe-buffer").setup(opts) + require("nvim-tree.actions.node.buffer").setup(opts) end return M diff --git a/lua/nvim-tree/actions/node/wipe-buffer.lua b/lua/nvim-tree/actions/node/wipe-buffer.lua deleted file mode 100644 index b7c5007cd8e..00000000000 --- a/lua/nvim-tree/actions/node/wipe-buffer.lua +++ /dev/null @@ -1,16 +0,0 @@ --- Copyright 2019 Yazdani Kiyan under MIT License -local utils = require("nvim-tree.actions.node.utils") - -local M = {} - ----@param filename string ----@param opts ApiNodeDeleteWipeBufferOpts|nil ----@return nil -function M.fn(filename, opts) - utils.delete_buffer("wipe", filename, opts) -end - -function M.setup(_) -end - -return M diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index f5cd9632277..031a18afaba 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -291,10 +291,10 @@ Api.node.navigate.opened.prev = wrap_node(actions.moves.item.fn({ where = "prev" ---@field force boolean|nil default false Api.node.buffer.delete = wrap_node(function(node, opts) - actions.node.delete_buffer.fn(node.absolute_path, opts) + actions.node.buffer.delete(node.absolute_path, opts) end) Api.node.buffer.wipe = wrap_node(function(node, opts) - actions.node.wipe_buffer.fn(node.absolute_path, opts) + actions.node.buffer.wipe(node.absolute_path, opts) end) Api.git.reload = wrap_explorer("reload_git") From 199c0c0f10bd397f8981c50b99878ccaab167e70 Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Fri, 17 Jan 2025 23:22:08 -0300 Subject: [PATCH 11/15] refactor: make wipe and delete fns take a node instead of a file path --- lua/nvim-tree/actions/node/buffer.lua | 12 ++++++------ lua/nvim-tree/api.lua | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lua/nvim-tree/actions/node/buffer.lua b/lua/nvim-tree/actions/node/buffer.lua index d256ffbfc26..a2aa6d951c1 100644 --- a/lua/nvim-tree/actions/node/buffer.lua +++ b/lua/nvim-tree/actions/node/buffer.lua @@ -3,18 +3,18 @@ local notify = require("nvim-tree.notify") local M = {} ----@param filename string +---@param node Node ---@param opts ApiNodeDeleteWipeBufferOpts|nil ---@return nil -function M.delete(filename, opts) - M.delete_buffer("delete", filename, opts) +function M.delete(node, opts) + M.delete_buffer("delete", node.absolute_path, opts) end ----@param filename string +---@param node Node ---@param opts ApiNodeDeleteWipeBufferOpts|nil ---@return nil -function M.wipe(filename, opts) - M.delete_buffer("wipe", filename, opts) +function M.wipe(node, opts) + M.delete_buffer("wipe", node.absolute_path, opts) end ---@alias ApiNodeDeleteWipeBufferMode '"delete"'|'"wipe"' diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 031a18afaba..748768dce58 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -291,10 +291,10 @@ Api.node.navigate.opened.prev = wrap_node(actions.moves.item.fn({ where = "prev" ---@field force boolean|nil default false Api.node.buffer.delete = wrap_node(function(node, opts) - actions.node.buffer.delete(node.absolute_path, opts) + actions.node.buffer.delete(node, opts) end) Api.node.buffer.wipe = wrap_node(function(node, opts) - actions.node.buffer.wipe(node.absolute_path, opts) + actions.node.buffer.wipe(node, opts) end) Api.git.reload = wrap_explorer("reload_git") From ede43ed0ba5ee55ff9cf25f32db4191e3268f3e8 Mon Sep 17 00:00:00 2001 From: Gabriel Crispino Date: Fri, 17 Jan 2025 23:53:04 -0300 Subject: [PATCH 12/15] docs: update help with new API commands --- doc/nvim-tree-lua.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 4ef9b1c340a..20f4beb9fbf 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -2164,6 +2164,12 @@ 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}) *nvim-tree-api.node.buffer.delete()* + Deletes node's related buffer. + +node.buffer.wipe({node}) *nvim-tree-api.node.buffer.wipe()* + Same as |api.node.buffer.delete()|, but runs :bwipe instead of :bdelete. + ============================================================================== 6.4 API GIT *nvim-tree-api.git* @@ -3178,6 +3184,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()| From 0703c4717af39af517492771320afbe87939df16 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Fri, 24 Jan 2025 09:29:12 +1100 Subject: [PATCH 13/15] remove refactored utils.lua --- lua/nvim-tree/actions/node/utils.lua | 44 ---------------------------- 1 file changed, 44 deletions(-) delete mode 100644 lua/nvim-tree/actions/node/utils.lua diff --git a/lua/nvim-tree/actions/node/utils.lua b/lua/nvim-tree/actions/node/utils.lua deleted file mode 100644 index 54a5d283037..00000000000 --- a/lua/nvim-tree/actions/node/utils.lua +++ /dev/null @@ -1,44 +0,0 @@ --- Copyright 2019 Yazdani Kiyan under MIT License -local notify = require("nvim-tree.notify") - -local M = {} - ----@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 From aa6fe10f1de95fa1f3b119da271f0fc4b33ef98b Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Fri, 24 Jan 2025 09:40:28 +1100 Subject: [PATCH 14/15] remove unused static setup --- lua/nvim-tree/actions/node/buffer.lua | 3 --- lua/nvim-tree/actions/node/init.lua | 1 - 2 files changed, 4 deletions(-) diff --git a/lua/nvim-tree/actions/node/buffer.lua b/lua/nvim-tree/actions/node/buffer.lua index a2aa6d951c1..425fcfa4ba6 100644 --- a/lua/nvim-tree/actions/node/buffer.lua +++ b/lua/nvim-tree/actions/node/buffer.lua @@ -55,7 +55,4 @@ function M.delete_buffer(mode, filename, opts) buf_fn({ filename, bang = force }) end -function M.setup(_) -end - return M diff --git a/lua/nvim-tree/actions/node/init.lua b/lua/nvim-tree/actions/node/init.lua index 3dac4eac5b3..f7075959b5e 100644 --- a/lua/nvim-tree/actions/node/init.lua +++ b/lua/nvim-tree/actions/node/init.lua @@ -10,7 +10,6 @@ function M.setup(opts) require("nvim-tree.actions.node.system-open").setup(opts) require("nvim-tree.actions.node.file-popup").setup(opts) require("nvim-tree.actions.node.open-file").setup(opts) - require("nvim-tree.actions.node.buffer").setup(opts) end return M From 7a1712ef3e4c71fbce8fdc3c0427a23df8e26418 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sat, 25 Jan 2025 12:43:18 +1100 Subject: [PATCH 15/15] tweak doc --- doc/nvim-tree-lua.txt | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 20f4beb9fbf..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,11 +2164,27 @@ 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}) *nvim-tree-api.node.buffer.delete()* - Deletes node's related buffer. +node.buffer.delete({node}, {opts}) *nvim-tree-api.node.buffer.delete()* + Deletes node's related buffer, if one exists. + Executes |:bdelete| or |:bdelete|! -node.buffer.wipe({node}) *nvim-tree-api.node.buffer.wipe()* - Same as |api.node.buffer.delete()|, but runs :bwipe instead of :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*