romgrk/barbar.nvim: The Neovim Tabline Plugin With Jump-to-Buffer Mode
The neovim tabline plugin.
At a glance
- What is it?
- barbar.nvim turns Neovim's buffer list into a re-orderable, clickable tabline. Here is how it installs, how jump-to-buffer mode assigns letters, and where it stops being the right tool.
- Who is it for?
- Adopt barbar.nvim if you keep many buffers open and want them visible, re-orderable and clickable, and if you are on Neovim v0.7 or newer. Skip it if you want the tabline to reflect Neovim's actual tab pages, or if you cannot accept that the README calls :BarbarDisable a very bad command with no documented recovery path.
- Can I use it commercially?
- Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
- Is it still maintained?
- Yes. The repository last received commits 113 days ago.
- What is it written in?
- Mainly Lua, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 24, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What barbar.nvim adds to Neovim's buffer list
Neovim separates buffers from windows and tab pages. A buffer is an open file in memory, a window is a viewport onto a buffer, and a tab page is a layout of windows. The built-in tabline shows tab pages, so opening ten files in one tab page leaves the tabline nearly empty. barbar.nvim repurposes that line to show buffers instead, which is the model the README means by the phrase "Tabs, as understood by any other editor."
The plugin targets people who work with a working set of files rather than a single file at a time. It adds re-orderable tabs, auto-sizing tabs that fill available space, clickable and closable tabs, pinned buffers, automatic sorting commands, and unique names when two files share a filename. The README lists nvim-web-devicons for icons and gitsigns.nvim for git status as optional requirements, so neither is needed for the core tabline.
How jump-to-buffer mode assigns its letters
The feature that distinguishes barbar.nvim from a plain bufferline is jump-to-buffer mode, entered with :BufferPick. In that mode each tab displays a target letter instead of its icon, and typing the letter jumps to that buffer. The README states the letter stays constant for the lifetime of the buffer, so once you have learned the letters for a set of files you can type them ahead from memory without looking at the tabline.
Letter assignment is not arbitrary. By default letters are derived from the buffer name, so README.md receives the letter r. The README notes this can be changed so letters are assigned by usability instead: home row first, using the keys asdfjkl;gh, then other rows. That second mode trades mnemonic value for typing comfort, and it is the setting to check if the default letters feel unpredictable on files with similar names. A separate command, :BufferPickDelete, puts the tabline into a picking mode for deletion rather than navigation.
Installing barbar.nvim and opening your first buffers
The README requires Neovim v0.7 or newer. The lazy.nvim example disables the plugin's own auto-setup so that lazy.nvim can call setup with your options instead:
require('lazy').setup {
{'romgrk/barbar.nvim',
dependencies = {
'lewis6991/gitsigns.nvim', -- OPTIONAL: for git status
'nvim-tree/nvim-web-devicons', -- OPTIONAL: for file icons
},
init = function() vim.g.barbar_auto_setup = false end,
opts = {},
version = '^1.0.0',
},
}After restarting Neovim, open a few files with :edit or :e and the tabline should list them. barbar.nvim ships no default mappings, so the README provides an example set. These four cover movement and re-ordering:
nnoremap <silent> <A-,> <Cmd>BufferPrevious<CR>
nnoremap <silent> <A-.> <Cmd>BufferNext<CR>
nnoremap <silent> <A-<> <Cmd>BufferMovePrevious<CR>
nnoremap <silent> <A->> <Cmd>BufferMoveNext<CR>The README warns that the Alt key is used in these mappings and that on iTerm for Mac you must map the Option key to Alt under Profiles then Keys, selecting Esc+. If the mappings do nothing, that terminal setting is the first thing to check. To close a buffer, the README recommends the included BufferClose command over :bdelete because it will not disturb your window layout. Pinning is available through :BufferPin, and sorting through commands such as :BufferOrderByName and :BufferOrderByLanguage.
Closing buffers without wrecking your window layout
The plugin bundles a modified version of bbye.vim, exposed as the BufferClose command and as bufferline#bbye#delete(buf). The distinction matters in practice. Deleting a buffer that is displayed in a split causes Neovim to close that window, which collapses your layout. The included implementation closes the buffer while preserving the arrangement of windows around it. The README also lists close variants including :BufferCloseAllButCurrent, :BufferCloseAllButVisible, :BufferCloseAllButPinned, :BufferCloseAllButCurrentOrPinned, :BufferCloseBuffersLeft and :BufferCloseBuffersRight, plus :BufferRestore to bring a closed buffer back and :BufferWipeout for a harder removal. If your workflow involves several splits on one tab page, this is the part of the plugin you will notice most.
Where barbar.nvim is the wrong tool
Two limitations are visible in the README itself. First, the disable path is not a supported configuration: the README labels :BarbarDisable a very bad command that should never be used, and it documents no recovery procedure. Treat enabling and disabling as a one-way door within a session.
Second, the plugin is not a tab-page manager. If you rely on Neovim's actual tab pages to hold distinct window layouts and want the tabline to show those layouts, barbar.nvim is showing you something else entirely. You would be replacing the built-in tabline's meaning rather than extending it. Clickable tabs also depend on mouse support: the README instructs you to set mouse+=a, and without it the left-click and middle-click behaviours described for tabs will not work. Icons depend on nvim-web-devicons, which by default requires a nerd font, though the README points to that project's setup instructions for removing the font requirement. None of these are defects, but each one is a prerequisite that is easy to miss when the plugin appears not to work.
barbar.nvim compared with Neovim's built-in tabline
The real alternative is not another plugin but the tabline Neovim already provides. The built-in line tracks tab pages, so it answers the question "which window layout am I in" and stays quiet about which files are open. barbar.nvim answers the opposite question: it lists buffers, lets you reorder them, and gives each one a stable jump letter. The two approaches are not interchangeable, and the choice depends on whether your unit of work is a layout or a file. A workflow built on one tab page per project and many buffers inside it fits barbar.nvim. A workflow built on separate tab pages for separate tasks fits the built-in line, and adding barbar.nvim on top would give you a tabline that no longer reflects the thing you navigate by.
Maintenance, releases and licensing
The repository is not archived, and the last push was on 2026-06-10. That is recent enough to treat the project as maintained, but the release history is uneven: v1.9.1 was tagged on 2024-08-05, v1.8.0 on 2024-06-07, and v1.7.0 on 2023-08-26. Commits and tagged releases therefore move at different paces, which is why the lazy.nvim example pins version to '^1.0.0' with the comment that this updates only when a new 1.x version is released. If you want tagged releases rather than the tip of master, that pin is the mechanism, and it also means you will wait for the next tag to receive fixes.
The repository does not state a licence in the files available here, and the README has no licence section. Before vendoring the plugin, copying its bundled bbye.vim derivative, or shipping it inside a distribution, check the licence file in the repository itself. The bundled bbye.vim is described as a modified version of another project, so the terms of that upstream work are worth confirming separately. This is a factual gap, not legal advice.
Editorial conclusion
Adopt barbar.nvim if you keep many buffers open and want them visible, re-orderable and clickable, and if you are on Neovim v0.7 or newer. Skip it if you want the tabline to reflect Neovim's actual tab pages, or if you cannot accept that the README calls :BarbarDisable a very bad command with no documented recovery path. Before adopting, verify that your plugin manager loads nvim-web-devicons and gitsigns.nvim directly rather than lazily, and confirm whether your terminal maps the Option key to Alt, since the sample mappings depend on it.
Frequently asked questions
How do I install barbar.nvim?
The README gives examples for lazy.nvim, packer.nvim and vim-plug. All of them require Neovim v0.7 or newer, and nvim-web-devicons and gitsigns.nvim are listed as optional dependencies for icons and git status.
What does jump-to-buffer mode do in barbar.nvim?
Entered with :BufferPick, it replaces each tab's icon with a target letter, and typing that letter jumps to the buffer. The README states the letter stays constant for the lifetime of the buffer.
Does barbar.nvim come with default key mappings?
No. The README says no default mappings are provided and gives an example set using the Alt key, covering movement, re-ordering, pinning, closing and sorting.
Why should I use BufferClose instead of bdelete with barbar.nvim?
The README recommends BufferClose because it will not mess your window layout. The plugin bundles a modified version of bbye.vim for this purpose, also available as bufferline#bbye#delete(buf).
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/romgrk-barbar-nvim)