Layout preserving buffer deletion in Lua.
new_demo.mov
This plugin manages the only [No Name] buffer as a replacement to achieve layout-preserving buffer-deletion.
The main function of this plugin is lua require('neo-no-name').neo_no_name(go_next),
where an optional function go_next can be provided to "go next" buffer in your way on deletion.
Two facts:
- call
neo_no_name(go_next)at any buffer that is not[No Name]...- will remove duplicate
[No Name]buffers if there are many. (This clean-up your buffer list) - will swap your current buffer with the
[No Name]buffer. (will create one if it doesn't exist)
- will remove duplicate
- call
neo_no_name(go_next)again at the[No Name]buffer...- will jump to the buffer arrived by
go_next()before that buffer got swapped out. - will delete the buffer that is swapped out.
- by providing
go_next, you can decide what's the next buffer on deletion.
- by providing
- will jump to the buffer arrived by
default: function () vim.cmd('bn') end
So, for example, if you're a user of akinsho/bufferline.nvim then you can pass something like this:
function()
vim.cmd('BufferLineCycleNext')
enddefault: true
whether or not to go_next() after you call neo_no_name(go_next) twice on the same window.
default: function return false end
For example, you can skip all terminal buffers on go_next():
should_skip = function ()
return vim.bo.buftype == 'terminal'
end,default: {}
You might want to avoid calling go_next on some situation.
In this case, you can call abort() in any function you provided by before_hooks:
before_hooks = {
-- this abort `NeoNoName` when calling on terminal buffer created by ibhagwan/fzf-lua.
function (u)
if vim.bo.filetype == 'fzf' then
vim.api.nvim_input('a<Esc>')
u.abort()
end
end,
}where u provides some APIs to change the behavior of this plugin:
utils.abort: abort the current execution of `NeoNoName`.
Feel free to create an issue/PR telling about what you need.
This is an example for wbthomason/packer.nvim
-- remove `use` if you're using folke/lazy.nvim
use {
'nyngwang/NeoNoName.lua',
config = function ()
require('neo-no-name').setup {
before_hooks = {
function (u)
if vim.bo.filetype == 'fzf' then
vim.api.nvim_input('a<Esc>')
u.abort()
end
end,
},
should_skip = function ()
-- never go next to a terminal buffer.
return vim.bo.buftype == 'terminal'
end,
go_next_on_delete = false, -- layout-preserving buffer deletion.
}
-- replace the current buffer with the `[No Name]`.
vim.keymap.set('n', '<M-w>', function () vim.cmd('NeoNoName') end)
-- the plain old buffer delete.
vim.keymap.set('n', '<Leader>bd', function ()
vim.cmd('NeoNoName')
vim.cmd('NeoNoName')
end)
end
}