# centaur-tabs gives Emacs a configurable tab bar with buffer groups

> centaur-tabs is an Emacs Lisp package that replaces the default tab bar with eight visual styles, buffer groups, reordering commands and integrations for Selectrum, Helm, Ivy and Projectile. It is a fork of awesome-tab with its own identity, and its last push was on 2026-06-19.

**ema2159/centaur-tabs** — Emacs plugin aiming to become an aesthetic, modern looking tabs plugin

- Repository: https://github.com/ema2159/centaur-tabs
- Stars: 867 · Forks: 54
- Language: Emacs Lisp
- License: GPL-3.0
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/ema2159-centaur-tabs

## A fork of awesome-tab that became its own package

centaur-tabs started as a fork of awesome-tab, taken with the permission of its author, and awesome-tab itself was based on tabbar. The project page makes clear that the code has been modified heavily enough that it may now be considered a different package. It also folds in functionality from tabbar-ruler.

The stated aim is an aesthetic, functional and efficient tabs plugin for Emacs with a lot of customization options. What that means in practice is a package that draws the tab bar itself rather than delegating to a generic buffer list, and one where nearly every visual detail is a variable the user can set.

The implementation is split across four Elisp files at the repository root: centaur-tabs.el, centaur-tabs-elements.el, centaur-tabs-functions.el and centaur-tabs-interactive.el. That separation between elements, functions and interactive commands is what allows the package to grow this many options without everything ending up in one file.

## Eight tab styles and a headline face that matches

The tab bar can be drawn in eight shapes, set through the centaur-tabs-style variable. The list is alternate, bar, box, chamfer, rounded, slant, wave and zigzag, and the project page shows a screenshot for each one so you can pick by eye rather than by name.

The style variable is the only setting most users need:

```elisp
(setq centaur-tabs-style "bar")
```

Two other variables shape the geometry. centaur-tabs-height sets the tab height, for example (setq centaur-tabs-height 32), and there is a separate option to change the font family and height.

The headline face governs the bar that sits above the tab line. The package ships a centaur-tabs-default face for its own tabs, and the function centaur-tabs-headline-match makes the headline face match it:

```elisp
(centaur-tabs-headline-match)
```

Without that call the tab bar and the mode line can look like they came from different themes, which is the most common complaint about this style of package.

## Installing from MELPA with use-package or require

The package is distributed through MELPA, and the project gives two configuration forms. The first is the use-package form, which is what most Emacs users now reach for:

```elisp
(use-package centaur-tabs
  :demand
  :config
  (centaur-tabs-mode t)
  :bind
  ("C-<prior>" . centaur-tabs-backward)
  ("C-<next>" . centaur-tabs-forward))
```

The :demand keyword forces the package to load rather than deferring it, :config turns on centaur-tabs-mode once loaded, and the two bindings map C-<prior> and C-<next> to the backward and forward commands.

If you do not use use-package, the plain require form does the same work:

```elisp
(require 'centaur-tabs)
(centaur-tabs-mode t)
(global-set-key (kbd "C-<prior>")  'centaur-tabs-backward)
(global-set-key (kbd "C-<next>") 'centaur-tabs-forward)
```

The mode is the switch that matters. Without (centaur-tabs-mode t) the package is loaded and does nothing visible.

## Icons come from all-the-icons or nerd-icons, with a plain fallback

Tab icons are opt in. Setting centaur-tabs-set-icons to t turns them on, and centaur-tabs-icon-type decides which icon set is used:

```elisp
(setq centaur-tabs-icon-type 'all-the-icons)  ; or 'nerd-icons
```

Two further variables control how the icons look. centaur-tabs-plain-icons renders them in the same colour as the tab text instead of the themed icon colour, and centaur-tabs-gray-out-icons dims the icons of unselected tabs, with the value 'buffer as the documented setting.

There is a common issues section in the documentation for exactly the case where icons do not appear, which is worth reading before spending time on the variables above. The dependency is on an icon package being present and configured, and the package does not bundle one.

The selected tab gets extra treatment as well. centaur-tabs-set-bar accepts 'left for a coloured bar at the left edge of the selected tab, 'over for an overline, and 'under for an underline, and the colour comes from the centaur-tabs-active-bar-face face. The underline option carries a caveat: outside Spacemacs you also need x-underline-at-descent-line set to t for it to display correctly. The close button can be disabled entirely with centaur-tabs-set-close-button, or given a different string with centaur-tabs-close-button.

## Buffer groups and reordering are the real reason to switch

Beyond appearance, the table of contents lists a group of features that change how the bar behaves. Buffers can be organised into groups, and there is an option to show group names instead of buffer names in the tabs. There is a setting to disable the package in selected buffers, one to prevent access to specified buffers, and a Vim like tab motions option.

Reordering gets its own entries, credited to two contributors. Buffer reordering, credited to jixiuf, lets you move buffers into a different order than they were visited, and alphabetical buffer reordering, credited to cburroughs, sorts them by name. There is also a fixed tab length option, which stops long buffer names from stretching the bar, and a tab cycling option.

These are the features that make the package a different tool from the default Emacs tab bar rather than a cosmetic layer on top of it. They are also the parts most likely to conflict with your own key bindings, so it is worth checking the key bindings section of the documentation before enabling several of them at once.

## Selectrum, Helm, Ivy and Projectile get their own entries

The package integrates with the completion and project tools people actually use. Selectrum integration is documented as reverting to completing-read, which is a compatibility decision worth knowing about if you have your own completing-read setup. There are separate sections for Helm, Ivy and Projectile.

Mouse support and a new tab button are also listed, credited to two more contributors, and there is an Ace jump entry for jumping straight to a tab. A tab count feature is present too, so you can see how many buffers are open at a glance.

The theme side of the package is handled by a known supported theme plugins section, which exists because the tab bar draws its own faces and has to be told how to match the rest of your theme. If the tabs look wrong after a theme change, that section is the place to look.

For developers, the Makefile wraps Eask, and the test suite runs through ERT:

```
test:
	@echo "Testing..."
	$(EASK) test ert ./test/*.el
```

There are also package, install, compile, checkdoc and package-lint targets, and a ci target that chains clean, package, install and compile.

## GPL-3.0, and untagged development since 2022

The licence is GPL-3.0, which is a copyleft licence and the opposite of the permissive licences common in the Emacs ecosystem. For most people who use the package that difference never comes up. If you intend to copy code from it into your own package, or to distribute a fork, that is a question for your own counsel rather than for this page.

The maintenance picture needs stating with care. The repository is not archived and the last push was on 2026-06-19, so work is still landing on the repository. The published releases tell a different story. The newest tagged release is 3.2, dated 2022-09-20, and before that came v3.1 on 2020-03-11 and 3.0.5 on 2020-03-06.

So the code in the repository is ahead of the newest release on MELPA, and installing from a package archive tracks tagged releases unless you configure the package system to pull from the repository directly. The project keeps a CHANGELOG.md, which is where to look when a checkout behaves differently from the archived version. Its own README also carries a to do section that has not been revisited in years, which is a good signal that the documentation lags the code in a few places.

## Conclusion

centaur-tabs is a good fit for an Emacs user who wants the tab bar to carry structure, since buffer groups, reordering and the project integrations are not something the built-in bar offers. It is a poor fit if you rely on tagged releases, because the newest published version is 3.2 from 2022-09-20 and development has continued untagged since. Before adopting it, install it from MELPA with the use-package form shown above, turn on centaur-tabs-mode, and check the table of contents for the buffer group and reordering options before deciding whether the configuration surface is worth it.

## FAQ

### How do I install centaur-tabs in Emacs?

The package is available from MELPA, and the project gives a use-package configuration that calls centaur-tabs-mode and binds centaur-tabs-backward and centaur-tabs-forward to C-<prior> and C-<next>. A plain require form is documented as well.

### How do I change the tab style in centaur-tabs?

The style is set with the centaur-tabs-style variable, and the available options are alternate, bar, box, chamfer, rounded, slant, wave and zigzag. The tab height is controlled separately with centaur-tabs-height.

### Why do the centaur-tabs icons not show up?

Icons require an icon package such as all-the-icons or nerd-icons, and centaur-tabs-icon-type selects which one is used. The project page has a common issues section covering icons not showing, which is where to start when they stay invisible.

## Sources

- [ema2159/centaur-tabs on GitHub](https://github.com/ema2159/centaur-tabs)
- [Issues](https://github.com/ema2159/centaur-tabs/issues)
- [License: GPL-3.0](https://github.com/ema2159/centaur-tabs/blob/master/LICENSE)
- [README](https://github.com/ema2159/centaur-tabs/blob/master/README.md)
- [Releases](https://github.com/ema2159/centaur-tabs/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/ema2159-centaur-tabs
