feat(bufdelete): optional filter and shortcuts to delete all and other buffers. Closes #11

This commit is contained in:
Folke Lemaitre 2024-11-08 10:58:40 +01:00
parent 020e42fd18
commit 71a234608f
No known key found for this signature in database
GPG key ID: 41F8B1FBACAE2040
3 changed files with 82 additions and 5 deletions

View file

@ -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 <https://github.com/kdheepak/panvimdoc>
vim:tw=78:ts=8:noet:ft=help:norl:

View file

@ -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()
```

View file

@ -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 <Esc>/<C-c> 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