Skip to content

motform/stimmung-themes

Repository files navigation

When you say: We’re in a good Stimmung, you mean a good psychological tuning, being well tuned together.

— Karlheinz Stockhausen, 1973

Stimmung, Emacs tuned to inner harmonies

Stimmung-themes is a pair of monoesuqe Emacs themes with minimal syntax highlighting. They are inspired by Tonsky’s Alabaster theme, following the maxim that a theme that highlights everything paradoxically highlights nothing. Text backgrounds (comments, strings and constants) and font variations (definitions/callsites) are used as alternatives to text colors, ensuring a harmonious reading experience. The hues of the stimmung-dark are selected to match the default macOS dark mode. The themes feature a (default golden beige) highlight color that you can set color and application of, see Customization.

Emacs packages often define their own faces, making theming a relatively sisyphean task. Stimmung-themes defines all default faces and some of the most common, and uncommon, packages. This includes programming modes like lsp-ui and magit, but also things like solaire and productivity/communication modes like notmuch or elfeed. Open an issue or make pull request if you lack a definition, they are always appreciated!

Screenshots

./.assets/clj.png

./.assets/tsx.png

./.assets/magit.png

The screenshots are set in PragmataPro (with line-height patched to 1.4) and feature modeline/whitespace settings inspired by rougier that you can find in my emacs.d.

Installation

Stimmung-themes is distributed via MELPA. Install it with your package manager of preference (package.el, straight, use-package) and make sure the following lines are in your init-file:

(require 'stimmung-themes) ; if you use package.el
(stimmung-themes-load-light)

A typical use-package installation might look something like:

(use-package stimmung-themes
  ;; :straight (stimmung-themes :host github :repo "motform/stimmung-themes") ; if you are a straight shooter
  :demand t
  :ensure t
  :config (stimmung-themes-load-light)) ; or (stimmung-themes-load-dark)

Note that some faces, like org-block, inherit from the fixed-pitch font, in order to allow them to properly work with variable-pitch-mode. This means that, in order to have a consistent experience, you may have to set the relevant face-attribute. For example:

(set-face-attribute 'default        nil :family "Iosevka"            :height fixed-size    :weight 'medium)
(set-face-attribute 'fixed-pitch    nil :family "Iosevka"            :height fixed-size    :weight 'medium)
(set-face-attribute 'variable-pitch nil :family "Overpass Nerd Font" :height variable-size :weight 'normal)

Customization

Stimmung offers extensive control what and how to highlight font-lock faces, i.e. the colors used for syntax highlighting. It exposes a number of customizable variables (see table) that take a value of either 'background (highlight behind the text), 'foreground (highlight of the text) or 'none (no highlight). In addition to these, one can control the color of the background and foreground highlight in both modes. See this thread for the fruitful discussion that introduced these.

variablevalues
stimmung-themes-dark-highlight-colorany Emacs color
stimmung-themes-dark-highlight-color-foregroundany Emacs color
stimmung-themes-light-highlight-colorany Emacs color
stimmung-themes-light-highlight-color-foregroundany Emacs color
stimmung-themes-builtin‘background (default), ‘foreground or ‘none
stimmung-themes-comment‘background (default), ‘foreground or ‘none
stimmung-themes-constant‘background (default), ‘foreground or ‘none
stimmung-themes-string‘background (default), ‘foreground or ‘none
stimmung-themes-markup‘background (default), ‘foreground or ‘none
stimmung-themes-type‘background (default), ‘foreground or ‘none
stimmung-themes-function-name‘background, ‘foreground or ‘none (default)
stimmung-themes-keyword‘background, ‘foreground or ‘none (default)
stimmung-themes-variable-name‘background, ‘foreground or ‘none (default)
stimmung-themes-preprocessor‘background, ‘foreground or ‘none (default)
stimmung-themes-regex‘background, ‘foreground or ‘none (default)

There is a convenience function to toggle between the dark and light theme, stimmung-themes-toggle, along with variants to interactively load the dark and light versions stimmung-themes-load-{light|dark}.