# zenburn-theme for Emacs: The Low Contrast Vim Theme, Ported

> zenburn-theme is a direct port of Jani Nurminen's Zenburn colour theme from Vim to Emacs, shipped as a single Emacs Lisp file with a custom-themes based implementation, per-colour overrides and scaled headings. It is aimed at Emacs users who want a dim, low contrast reading environment.

**bbatsov/zenburn-emacs** — The Zenburn colour theme ported to Emacs

- Repository: https://github.com/bbatsov/zenburn-emacs
- Stars: 1,084 · Forks: 265
- Language: Emacs Lisp
- License: GPL-3.0
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/bbatsov-zenburn-emacs

## A Direct Port of Jani Nurminen's Vim Theme

Zenburn is a colour theme that began as a Vim theme by Jani Nurminen, and zenburn-theme for Emacs is described in the README as a direct port of it. The author's stated reason for choosing it is that it is one of the best low contrast colour themes available and exceptionally easy on the eyes, which is a preference rather than a measurable claim, but it does explain the design targets.

Implementation-wise this is a modern Emacs theme. The README notes that it uses the built-in theming support available starting with Emacs 24.1, and adds a footnote explaining that this support was new in 2010 when the package was created. In other words, the theme was written against the custom-themes API from the start and does not carry the older color-theme compatibility code.

The package is a single Emacs Lisp file, zenburn-theme.el, alongside a test/ directory, a CHANGELOG.md, a CONTRIBUTING.md and an Eldev file, with screenshots of the overview and a scaled variant. A continuous integration badge points at a GitHub Actions workflow. The scale of the code matches the scope: this is a theme, not a framework.

## Installing Through MELPA, ELPA or a Downloaded File

There are three documented routes. The quickest is package.el, since Zenburn is available in NonGNU ELPA, MELPA Stable and MELPA, and the README gives the command as an interactive call rather than a shell one:

`M-x package-install zenburn-theme`

To have it applied on every start, the init file needs a load call:

```lisp
(load-theme 'zenburn t)
```

If you use use-package, the same effect is expressed through its config block:

```emacs-lisp
(use-package zenburn-theme
  :config
  (load-theme 'zenburn t))
```

The manual route is to download zenburn-theme.el into ~/.emacs.d/themes/ and add that directory to the theme load path in your .emacs or init.el:

```lisp
(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/")
```

After that, the interactive function load-theme finds it with M-x load-theme RET zenburn. Debian and Ubuntu users have a distribution package: on Debian 9 or later and Ubuntu 16.10 or later, the README says you may simply run apt-get install elpa-zenburn-theme. Users of Emacs Prelude already have Zenburn, since it is bundled into Prelude and is that distribution's default colour theme.

## Overriding Individual Colours Without Forking the Theme

The theme exposes an escape hatch for the common case, which is wanting a few colours changed rather than a new theme. Before loading the theme you can define new values in the zenburn-override-colors-alist variable, and the README gives an example that replaces the lighter background shades:

```elisp
(setq zenburn-override-colors-alist
      '(("zenburn-bg+05" . "#282828")
        ("zenburn-bg+1"  . "#2F2F2F")
        ("zenburn-bg+2"  . "#3F3F3F")
        ("zenburn-bg+3"  . "#4F4F4F")))
(load-theme 'zenburn t)
```

The list of overridable names is not a separate document. The README says the full list of colour names you can override is in the zenburn-theme.el source file, which means the authoritative list is the source, and a value such as zenburn-bg+05 is addressed by the internal name of the theme colour rather than by a friendly label.

The order matters here, and the README is explicit that the overrides have to be set before the theme is loaded. The mechanism is a plain variable consulted at load time, so setting it afterwards has no effect on a theme that is already applied.

## Rebinding Faces With custom-theme-set-faces

Where the colour override mechanism handles values, face customisation is handled with the standard Emacs tools. The README says you can change faces with custom-theme-set-faces or with use-package, and the example it gives defines a small alist of colours and applies one of them to the region face through a custom-face block:

```emacs-lisp
(use-package zenburn-theme
  :preface
  (setq my/zenburn-colors-alist
        '((fg . "#DCDCCC") (bg . "#1C1C1C") (cyan . "#93E0E3")))
  :custom-face
  (region ((t (:background ,(alist-get my/zenburn-colors-alist 'cyan)))))
  :config
  (load-theme 'zenburn t))
```

The point of the example is the indirection. The custom-face block resolves a colour from a user-defined alist at the time the theme is configured, so the face ends up bound to a value you can change in one place rather than a literal hex string repeated across your configuration. The README also links to an article on customizing colour themes for the longer form of this pattern.

This is the ordinary Emacs theming workflow rather than something Zenburn specific, which is worth noting: the package participates in the platform's own extension points instead of inventing a parallel configuration system.

## Scaled Headings and Variable Pitch Fonts

Beyond colour, the theme has three settings that affect typography, and all three are documented as needing to be set before the theme is loaded:

```elisp
;; use variable-pitch fonts for some headings and titles
(setq zenburn-use-variable-pitch t)

;; scale headings in org-mode
(setq zenburn-scale-org-headlines t)

;; scale headings in outline-mode
(setq zenburn-scale-outline-headlines t)
```

The first switches some headings and titles to a variable-pitch font, which in Emacs means a face that asks the font system for a proportional family rather than insisting on the monospace default. The second and third scale the heading size in Org mode and in outline mode, so the outline of a document is visually distinguishable from its body without you rewriting your Org headline settings.

The repository includes a separate screenshot of the scaled appearance, which suggests the maintainer treats this as a headline feature rather than a minor tweak. The variables are plain defcustom-style settings read at load time, so the ordering requirement in the README is a real constraint rather than a stylistic note.

## Terminal Emacs and the TERM=xterm-256color Fix

The FAQ covers a problem that is specific to running the theme in a terminal, and it is worth knowing before you decide the theme looks wrong. The README says that if your Emacs looks considerably uglier in a terminal compared to the GUI version, adding an export to your.bashrc or.zshrc helps:

```bash
export TERM=xterm-256color
```

Sourcing the shell file and starting Emacs again is the documented follow-up step. The cause is the terminal's colour capability rather than the theme: a terminal that reports fewer colours than the theme asks for will approximate them, and the low contrast palette is exactly the kind of palette that degrades badly under approximation.

The other bug-reporting route is the project's integrated issue tracker, and the README invites patches and pull requests for improvements that should go upstream. A CHANGELOG.md is shipped alongside and is described as fairly extensive, which is where a user upgrading from an old version can find out what changed.

## Version Numbers, Licence and What a Theme Can and Cannot Do

The release history shows steady maintenance. The recent tags are v2.11.0 from 2026-07-26, v2.10.0 from 2026-06-01 and v2.9.0 from 2026-03-29, the repository is not archived, and the last push was on 2026-09-01. The version scheme is a simple major.minor.patch line rather than the date-based scheme used by some of the packages in this category.

The licence is the GNU General Public License, version 3, with copyright attributed to Bozhidar Batsov and contributors from 2010 to 2026. A GPL-3.0 theme carries copyleft obligations for distribution, which is unusual for a colour scheme but not unusual for Emacs packages, and the licence file and the README badge both state it plainly.

What the package deliberately does not do is worth naming, because it bounds the decision. There is no light mode variant, no alternate palette, and no generator that produces the theme from a source colour scheme. The palette is hand maintained and ported. If you want a theme that follows your system appearance, or that regenerates itself when you change a base colour, Zenburn is the wrong package, and if you want exactly this palette with slightly different values, the override alist is the supported way to get there.

## Conclusion

zenburn-theme fits Emacs users on a dim screen who want the exact Zenburn palette from Vim, installable from MELPA in one command and adjustable without forking the theme. It is a poor fit if you need light mode variants, a custom theme variant, or a theme tied to a particular colour scheme generator, since the package is a hand maintained port in one file. Before installing, check that your Emacs supports the built-in theming support that arrived in 24.1, since the theme relies on it, and read CHANGELOG.md if you are upgrading from an older version. The theme is GPL-3.0 licensed, the newest release is v2.11.0 from 2026-07-26, and the last push was on 2026-09-01.

## FAQ

### How do I install zenburn-theme in Emacs?

The theme is on NonGNU ELPA, MELPA Stable and MELPA, so `M-x package-install zenburn-theme` installs it, and `(load-theme 'zenburn t)` in your init file applies it at startup. Debian 9 or later and Ubuntu 16.10 or later users can also run `apt-get install elpa-zenburn-theme`.

### How do I change individual colours in zenburn-theme?

Set values in the zenburn-override-colors-alist variable before loading the theme, for example by pairing names such as zenburn-bg+05 with a hex value. The full list of overridable colour names is in the zenburn-theme.el source file.

### Why does the theme look bad in terminal Emacs?

The README attributes it to the terminal rather than the theme and suggests exporting TERM=xterm-256color in your .bashrc or .zshrc, then sourcing it and starting Emacs again. A terminal that reports fewer colours will approximate a low contrast palette badly.

### Can I use zenburn-theme with use-package?

Yes. The README gives a use-package form with a :config block that calls (load-theme 'zenburn t), and a separate example with a :preface alist of colours and a :custom-face block that rebinds a face such as region.

### Does zenburn-theme scale Org headings?

Yes, if you set zenburn-scale-org-headlines and zenburn-scale-outline-headlines before loading the theme, and you can also set zenburn-use-variable-pitch to use a variable-pitch font for some headings and titles. The repository includes a screenshot of the scaled result.

## Sources

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

---

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