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}.