diff --git a/doc/snacks-bufdelete.txt b/doc/snacks-bufdelete.txt index 52e551bb..a9f9d2e9 100644 --- a/doc/snacks-bufdelete.txt +++ b/doc/snacks-bufdelete.txt @@ -5,7 +5,9 @@ Table of Contents *snacks-bufdelete-table-of-contents* 1. Module |snacks-bufdelete-module| - Snacks.bufdelete() |snacks-bufdelete-module-snacks.bufdelete()| + - Snacks.bufdelete.all() |snacks-bufdelete-module-snacks.bufdelete.all()| - Snacks.bufdelete.delete()|snacks-bufdelete-module-snacks.bufdelete.delete()| + - Snacks.bufdelete.other()|snacks-bufdelete-module-snacks.bufdelete.other()| Delete buffers without disrupting window layout. If the buffer you want to close has changes, a prompt will be shown to save or @@ -24,13 +26,35 @@ SNACKS.BUFDELETE() *snacks-bufdelete-module-snacks.bufdelete()* < -SNACKS.BUFDELETE.DELETE() *snacks-bufdelete-module-snacks.bufdelete.delete()* +SNACKS.BUFDELETE.ALL() *snacks-bufdelete-module-snacks.bufdelete.all()* + +Delete all buffers >lua - ---@param buf number? + Snacks.bufdelete.all() +< + + +SNACKS.BUFDELETE.DELETE() *snacks-bufdelete-module-snacks.bufdelete.delete()* + +Delete a buffer: - either the current buffer if `buf` is not provided - or the +buffer `buf` if it is a number - or every buffer for which `buf` returns true +if it is a function + +>lua + ---@param buf? number | fun(buf: number): boolean Snacks.bufdelete.delete(buf) < + +SNACKS.BUFDELETE.OTHER() *snacks-bufdelete-module-snacks.bufdelete.other()* + +Delete all buffers except the current one + +>lua + Snacks.bufdelete.other() +< + Generated by panvimdoc vim:tw=78:ts=8:noet:ft=help:norl: diff --git a/docs/bufdelete.md b/docs/bufdelete.md index 4e5846f6..e13f2b51 100644 --- a/docs/bufdelete.md +++ b/docs/bufdelete.md @@ -16,9 +16,30 @@ a prompt will be shown to save or discard. Snacks.bufdelete() ``` -### `Snacks.bufdelete.delete()` +### `Snacks.bufdelete.all()` + +Delete all buffers ```lua ----@param buf number? +Snacks.bufdelete.all() +``` + +### `Snacks.bufdelete.delete()` + +Delete a buffer: +- either the current buffer if `buf` is not provided +- or the buffer `buf` if it is a number +- or every buffer for which `buf` returns true if it is a function + +```lua +---@param buf? number | fun(buf: number): boolean Snacks.bufdelete.delete(buf) ``` + +### `Snacks.bufdelete.other()` + +Delete all buffers except the current one + +```lua +Snacks.bufdelete.other() +``` diff --git a/lua/snacks/bufdelete.lua b/lua/snacks/bufdelete.lua index 1b32db0f..faa2928d 100644 --- a/lua/snacks/bufdelete.lua +++ b/lua/snacks/bufdelete.lua @@ -7,11 +7,29 @@ local M = setmetatable({}, { end, }) ----@param buf number? +--- Delete a buffer: +--- - either the current buffer if `buf` is not provided +--- - or the buffer `buf` if it is a number +--- - or every buffer for which `buf` returns true if it is a function +---@param buf? number | fun(buf: number): boolean function M.delete(buf) + if type(buf) == "function" then + for _, b in ipairs(vim.api.nvim_list_bufs()) do + if vim.bo[b].buflisted and buf(b) then + M.delete(b) + end + end + return + end + buf = buf or 0 buf = buf == 0 and vim.api.nvim_get_current_buf() or buf + -- Ensure we always run in the target buffer + if buf ~= vim.api.nvim_get_current_buf() then + return vim.api.nvim_buf_call(buf, M.delete) + end + if vim.bo.modified then local choice = vim.fn.confirm(("Save changes to %q?"):format(vim.fn.bufname()), "&Yes\n&No\n&Cancel") if choice == 0 or choice == 3 then -- 0 for / and 3 for Cancel @@ -50,4 +68,18 @@ function M.delete(buf) end end +--- Delete all buffers +function M.all() + return M.delete(function() + return true + end) +end + +--- Delete all buffers except the current one +function M.other() + return M.delete(function(b) + return b ~= vim.api.nvim_get_current_buf() + end) +end + return M