• Stars
    star
    3,497
  • Rank 12,726 (Top 0.3 %)
  • Language
    Lua
  • License
    GNU General Publi...
  • Created over 4 years ago
  • Updated 24 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A snazzy bufferline for Neovim

CI

bufferline.nvim

A snazzy 💅 buffer line (with tabpage integration) for Neovim built using lua.

Demo GIF

This plugin shamelessly attempts to emulate the aesthetics of GUI text editors/Doom Emacs. It was inspired by a screenshot of DOOM Emacs using centaur tabs.

Requirements

  • Neovim 0.8+
  • A patched font (see nerd fonts)
  • A colorscheme (either your custom highlight or a maintained one somewhere)

Installation

It is advised that you specify either the latest tag or a specific tag and bump them manually if you'd prefer to inspect changes before updating. If you'd like to use an older version of the plugin compatible with nvim-0.6.1 and below please change your tag to tag = "v1.*"

Lua

-- using packer.nvim
use {'akinsho/bufferline.nvim', tag = "*", requires = 'nvim-tree/nvim-web-devicons'}

-- using lazy.nvim
{'akinsho/bufferline.nvim', version = "*", dependencies = 'nvim-tree/nvim-web-devicons'}

Vimscript

Plug 'nvim-tree/nvim-web-devicons' " Recommended (for coloured icons)
" Plug 'ryanoasis/vim-devicons' Icons without colours
Plug 'akinsho/bufferline.nvim', { 'tag': '*' }

Usage

See the docs for details :h bufferline.nvim

You need to be using termguicolors for this plugin to work, as it reads the hex gui color values of various highlight groups.

Vimscript

" In your init.lua or init.vim
set termguicolors
lua << EOF
require("bufferline").setup{}
EOF

Lua

vim.opt.termguicolors = true
require("bufferline").setup{}

You can close buffers by clicking the close icon or by right clicking the tab anywhere

Configuration

for more details on how to configure this plugin in details please see :h bufferline-configuration

Features

  • Colours derived from colorscheme where possible.

  • Sort buffers by extension, directory or pass in a custom compare function

  • Configuration via lua functions for greater customization.

Alternate styling

Slanted tabs

slanted tabs

NOTE: some terminals require special characters to be padded so set the style to padded_slant if the appearance isn't right in your terminal emulator. Please keep in mind though that results may vary depending on your terminal emulator of choice and this style might will not work for all terminals

Sloped tabs

sloped tabs

see: :h bufferline-styling


Hover events

NOTE: this is only available for >= neovim 0.8+

hover-event-preview

see :help bufferline-hover-events for more information on configuration


Underline indicator

Screen Shot 2022-08-22 at 09 14 24

NOTE: as with the above your mileage will vary based on your terminal emulator. The screenshot above was achieved using kitty nightly (as of August 2022), with increased underline thickness and an increased underline position so it sits further from the text


Tabpages

Screen Shot 2022-03-08 at 17 39 57

This plugin can also be set to show only tabpages. This can be done by setting the mode option to tabs. This will change the bufferline to a tabline it has a lot of the same features/styling but not all.

A few things to note are

  • Sorting doesn't work yet as that needs to be thought through.
  • Grouping doesn't work yet as that also needs to be thought through.

LSP indicators

LSP Indicator

By setting diagnostics = "nvim_lsp" | "coc" you will get an indicator in the bufferline for a given tab if it has any errors This will allow you to tell at a glance if a particular buffer has errors.

In order to customise the appearance of the diagnostic count you can pass a custom function in your setup.

snippet
-- rest of config ...

--- count is an integer representing total count of errors
--- level is a string "error" | "warning"
--- diagnostics_dict is a dictionary from error level ("error", "warning" or "info")to number of errors for each level.
--- this should return a string
--- Don't get too fancy as this function will be executed a lot
diagnostics_indicator = function(count, level, diagnostics_dict, context)
  local icon = level:match("error") and "" or ""
  return " " .. icon .. count
end

diagnostics_indicator

snippet
diagnostics_indicator = function(count, level, diagnostics_dict, context)
  local s = " "
  for e, n in pairs(diagnostics_dict) do
    local sym = e == "error" and ""
      or (e == "warning" and "" or "" )
    s = s .. n .. sym
  end
  return s
end

The highlighting for the file name if there is an error can be changed by replacing the highlights for see:

:h bufferline-highlights

LSP indicators can additionally be reported conditionally, based on buffer context. For instance, you could disable reporting LSP indicators for the current buffer and only have them appear for other buffers.

diagnostics_indicator = function(count, level, diagnostics_dict, context)
  if context.buffer:current() then
    return ''
  end

  return ''
end

current visible

The first bufferline shows diagnostic.lua as the currently opened current buffer. It has LSP reported errors, but they don't show up in the bufferline. The second bufferline shows 500-nvim-bufferline.lua as the currently opened current buffer. Because the 'faulty' diagnostic.lua buffer has now transitioned from current to visible, the LSP indicator does show up.


Groups

bufferline_group_toggle

The buffers this plugin shows can be grouped based on a users configuration. Groups are a way of allowing a user to visualize related buffers in clusters as well as operating on them together e.g. by clicking the group indicator all grouped buffers can be hidden. They are partially inspired by google chrome's tabs as well as centaur tab's groups.

see :help bufferline-groups for more information on how to set these up


Sidebar offsets

explorer header


Numbers

bufferline with numbers

You can prefix buffer names with either the ordinal or buffer id, using the numbers option. Currently this can be specified as either a string of buffer_id | ordinal or a function

numbers

see :help bufferline-numbers for more details


Unique names

duplicate names


Close icons

close button


Re-ordering

re-order buffers

This order can be persisted between sessions (enabled by default).


Picking

bufferline pick


Pinning

Screen Shot 2022-03-31 at 18 13 50


Custom areas

custom area

see :help bufferline-custom-areas

How do I see only buffers per tab?

This behaviour is not native in neovim there is no internal concept of localised buffers to tabs as that is not how tabs were designed to work. They were designed to show an arbitrary layout of windows per tab.

You can get this behaviour using scope.nvim with this plugin. Although I believe a better long-term solution for users who want this functionality is to ask for real native support for this upstream.

Caveats

  • This won't appeal to everyone's tastes. This plugin is opinionated about how the tabline looks, it's unlikely to please everyone.

  • I want to prevent this becoming a pain to maintain so I'll be conservative about what I add.

  • This plugin relies on some basic highlights being set by your colour scheme i.e. Normal, String, TabLineSel (WildMenu as fallback), Comment. It's unlikely to work with all colour schemes. You can either try manually overriding the colours or manually creating these highlight groups before loading this plugin.

  • If the contrast in your colour scheme isn't very high, think an all black colour scheme, some of the highlights of this plugin won't really work as intended since it depends on darkening things.

FAQ

  • Why isn't the bufferline appearing?

    The most common reason for this that has come up in various issues is it clashes with another plugin. Please make sure that you do not have another bufferline plugin installed.

    If you are using airline make sure you set let g:airline#extensions#tabline#enabled = 0. If you are using lightline this also takes over the tabline by default and needs to be deactivated.

    If you are on Windows and use the GUI version of nvim (nvim-qt.exe) then also ensure, that GuiTabline is disabled. For this create a file called ginit.vim in your nvim config directory and put the line GuiTabline 0 in it. Otherwise the QT tabline will overlay any terminal tablines.

  • Doesn't this plugin go against the "vim way"?

    This is much better explained by buftablines's author. Please read this for a more comprehensive answer to this questions. The short answer to this is buffers represent files in nvim and tabs, a collection of windows (or just one). Vim natively allows visualising tabs i.e. collections of window, but not just the files that are open. There are endless debates on this topic, but allowing a user to see what files they have open doesn't go against any clearly stated vim philosophy. It's a text editor and not a religion 🙏. Obviously this won't appeal to everyone, which isn't really a feasible objective anyway.

More Repositories

1

toggleterm.nvim

A neovim lua plugin to help easily manage multiple terminal windows
Lua
4,352
star
2

flutter-tools.nvim

Tools to help create flutter apps in neovim using the native lsp
Lua
987
star
3

git-conflict.nvim

A plugin to visualise and resolve merge conflicts in neovim
Lua
981
star
4

dotfiles

🏡 dotfiles
Lua
235
star
5

org-bullets.nvim

Lua
113
star
6

horizon.nvim

Horizon Theme - Neovim Edition 🌅
Lua
45
star
7

dependency-assist.nvim

A neovim plugin to help find/search for dependency information/versions
Lua
44
star
8

pubspec-assist.nvim

Lua
25
star
9

gitgazer

A CLI app that lets you keep track of developments in your favourite repos on Github
Go
11
star
10

clock.nvim

A neovim plugin to show a timer in a floating window
Lua
10
star
11

oni-theme-night-owl

Night Owl - Onivim Editor theme
Vim Script
6
star
12

algorhythms

Rust
3
star
13

portfolio

Personal Portfolio aka the doings
OCaml
3
star
14

react-event-planner

⏰⏳ React to Time
JavaScript
2
star
15

phoenix-kitty

A go script to save the current kitty state to a session file
Go
2
star
16

vim-dune

Syntax File for Dune
Vim Script
2
star
17

Oni_the_guification_of_neovim

Vim Conf 18 Talk Slides
JavaScript
2
star
18

postgres-workshop

Postgres Workshop
JavaScript
2
star
19

go-game-of-life

The Game of Life in Go using the Ebiten library
Go
2
star
20

gopher

Go
1
star
21

Monzoid

JavaScript
1
star
22

express-handlebars-week

1
star
23

oni-plugin-eslint

An ESLint plugin for Oni vim
JavaScript
1
star
24

clojure-counter

A Stunningly simplistic clojure counter and clock
Clojure
1
star
25

Tips-and-Tricks

A repository of aforementioned tips and tricks
1
star
26

Akins-Pocket

My Bespoke Version of Pocket
JavaScript
1
star
27

lightline-statuslinetabs

A Vim plugin to show tabs in the Lightline Statusline
Vim Script
1
star
28

game-of-life

James Conway's Game of Life [WIP!!]
JavaScript
1
star
29

human-phenotype-challenge

A Visualisation of the Human Phenotype Ontology
JavaScript
1
star
30

week8-PA-Github-pajes

The real Github Pajes the other fork is unauthorised, okay thanks
JavaScript
1
star
31

all-of-fac

An App designed with React to visualise all the members of Founders and Coders
JavaScript
1
star
32

rota-app

Scheduling and rota management React app
JavaScript
1
star
33

ctrl-grp-api

An NodeJS API for the ctrl-grp challenge (link to demo ->)
JavaScript
1
star