In this post, I want to show how I added a bit of additional color to my theme for faces
assigned by the built-in Emacs 📖 29 treesit
package.
Introduction
adopting Emacs, I have used the Modus Themes. I appreciate Protesilaos Stavrou (Prot 📖)’s focus on accessibility for the Modus Themes as well as a commitment to accessible documentation.
When you dive deeper into the Modus Themes, you see how customizable and extensible the themes are. I suspect it could be used as a theme-building framework.
In
Adding Consistent Color to Emacs Mode Line and iTerm Tab for Various Projects, I showed one way that I’m leveraging Modus Themes to set my mode-line
and iTerm2 tab colors by project.
My Emacs Configuration
I’m favoring treesit
modes over other modes as Tree Sitter 📖 provides a more robust syntax highlighting.
Below is my treesit
and treesit-auto
configuration. The treesit
package is part of Emacs 29. The treesit-auto
package provides automatic translations from non-treesit
modes to their corresponding treesit
modes.
A very helpful package to help bridge other packages that assume one language mode (e.g. ruby-mode
) when treesit
sets it to a different mode (e.g. ruby-ts-mode
).
(use-package treesit
:custom (treesit-font-lock-level 4)
:straight (:type built-in))
(use-package treesit-auto
:straight (:host github :repo "renzmann/treesit-auto")
:config (setq treesit-auto-install 'prompt)
(global-treesit-auto-mode))
Next is the code I use to set my modus-theme
.
I prefer the “tinted” variation as the day mode (e.g. “operandi”) it’s a bit gentler on my eyes.
Most importantly is using modus-themes-load-theme
, as that is the function that calls the modus-themes-after-load-theme-hook
.
More on that in a bit.
(defun jf/emacs-theme-by-osx-appearance ()
"Set theme based on OSX appearance state."
(if (equal "Dark" (substring
(shell-command-to-string
"defaults read -g AppleInterfaceStyle")
0 4))
(modus-themes-load-theme 'modus-vivendi-tinted)
(modus-themes-load-theme 'modus-operandi-tinted)))
(jf/emacs-theme-by-osx-appearance)
I used the describe-text-properties
function to inspect the opening regular expression character. It had the font-lock-regexp-face
face.
Likewise, I did the following for Ruby’s string interpolation function (e.g. #{}
). That had the face of font-lock-misc-punctuation-face
.
Following the Modus Themes documentation, I added the code for setting the foreground color.
(defun jf/modus-themes-custom-faces ()
(modus-themes-with-colors
(custom-set-faces
`(font-lock-misc-punctuation-face
((,c :foreground ,green-warmer)))
`(font-lock-regexp-face
((,c :foreground ,red-cooler))))))
(add-hook 'modus-themes-after-load-theme-hook
#'jf/modus-themes-custom-faces)