A smart tabline that helps you focus
Focus on what matters
unclutter.nvim is a tabline that removes the clutter to help you focus on the files that matter to you.
Use your favorite package manager. Don't forget to call setup
.
{
"pablopunk/unclutter.nvim",
dependencies = {
"nvim-tree/nvim-web-devicons" -- optional, to show icons on tabs
"nvim-telescope/telescope.nvim" -- optional, to use the telescope integration
},
config = true -- this will call require("unclutter").setup()
}
You're working on a large project and you're jumping through function definitions and index files that endup cluttering your tabline. Unclutter.nvim will:
A minimal tabline with icons will show:
Every other buffer will be closed at the time you leave it (BufLeave
).
telescope.nvim
integrationIf you use telescope.nvim, you can use it to list all your unclutter.nvim
in a floating window:
require('unclutter.telescope').open()
Of course, you can map it to whatever you want:
vim.keymap.set("n", "<leader>b", require("unclutter.telescope").open, { noremap = true })
You can customize the format of the telescope results:
unclutter.telescope { format = "compact" } -- DEFAULT: folder/file.js
unclutter.telescope { format = "cwd" } -- path/folder/file.js
unclutter.telescope { format = "filename" } -- file.js
You can also hide the current buffer in the list:
unclutter.telescope { hide_current = true } -- default: false
If you want to use the telescope integration without the tabline, you can disable it:
require('unclutter').setup {
tabline = false,
}
Here's the default configuration:
require('unclutter').setup {
clean_after = 3, -- number of tabs to start uncluttering. i.e don't hide until 4 tabs are open
tabline = true, -- show tabline. You can set it to false and only use the [telescope integration](#telescopenvim-integration)
}
If you want to hack it or create your own mappings, you can use the following functions:
local unclutter = require("unclutter")
local tabline = require("unclutter.tabline")
local buffer = require("unclutter.buffer")
local plugin = require("unclutter.plugin")
tabline.keep_buffer(bufnr) -- Show buffer in tabline
tabline.remove_buffer(bufnr) -- Show buffer in tabline
tabline.toggle_buffer(bufnr) -- Toggle buffer in tabline
tabline.list() -- List tabline buffers
-- If you want to get the current buffer you can use:
local bufnr = buffer.current()
tabline.keep(bufnr)
-- navigate tabline buffers (like :bnext and :bprev)
tabline.next() -- Go to next buffer
tabline.prev() -- Go to previous buffer
-- handle plugin (on/off)
plugin.enable() -- Enable unclutter
plugin.disable() -- Disable unclutter
Example mappings:
vim.keymap.set("n", "gn", unclutter.next, { noremap = true })
vim.keymap.set("n", "gp", unclutter.prev, { noremap = true })
I personally have a map to save a file to disk (<c-s>
will :w
) so the buffer will be kept in the tabline whenever I do <c-s>
.
Of course:
:help unclutter
This behavior was inspired by vscode (sorry), that won't keep your tabs open until you hit save (or double-click the tab).
To create the tabline I used mini.tabline as a starting point. It's a great plugin and the one I was using before. The label/tabs implementation on tabline.lua
is an adaptation of mini.tabline's code.
Also this plugin was not only inspired by harpoon too, it's the main reason behind it. I was trying to hack harpoon to get this behavior, but didn't like the outcome. The plugin is great but I don't like their tabs implementation and other small stuff. It was there when I realized I could just code my own.
Other plugins I've used to unclutter in the past: