How to toggle between light-background and dark-background themes in tmux.

tmux’s window-style setting changes the default foreground and background colours for windows, and you can use it to toggle your terminal between light-on-dark and dark-on-light themes:

$ # Change the current window (all panes) to light background.
$ tmux set window-style 'fg=#171421,bg=#ffffff'
$ # Change back to dark background.
$ tmux set window-style 'fg=#d0cfcc,bg=#171421'

Here’s a shell script to toggle between light and dark:

#!/usr/bin/env sh
#
# Toggle the current window (all panes) between light and dark themes.
set -e

default_window_style='fg=#d0cfcc,bg=#171421'
alternate_window_style='fg=#171421,bg=#ffffff'
current_window_style=$(tmux show -Av window-style)

case $current_window_style in
    $default_window_style|'default')
        # Change to the alternate window style.
        tmux set window-style $alternate_window_style
        ;;
    *)
        # Change back to the default window style.
        tmux set window-style $default_window_style
        ;;
esac

Save this script as ~/.tmux/bin/toggle-theme and mark it executable (chmod u+x ~/.tmux/bin/toggle-theme) and you can toggle between dark and light mode with a single command:

$ ~/.tmux/bin/toggle-theme

You can bind a keyboard shortcut to toggle the theme. For example add this to your ~/.tmux.conf file:

bind T run-shell ~/.tmux/bin/toggle-theme

Reload the file:

$ tmux source ~/.tmux.conf

Now Ctrl + b Shift + t toggles between light and dark mode.

You might want to add more lines to the script to change other options like pane-border-style and pane-active-border-style (the colours of the pane borders) between light and dark mode. See the full version of the script in my tmux config for an example.

The script changes the default foreground and background colours of the current window (all panes). You’ll want your status line colours to be ones that work well against either a dark or a light background, since the same session might contain both light and dark windows at the same time. I’m using these (in my ~/.tmux.conf):

set -g status-style 'fg=#d0cfcc,bg=#171421'
set -g window-status-current-style 'bg=default,reverse'

You can also use -g to change the colours of all windows across all sessions or -p to change the colours of the current pane only:

$ # Change the colours of all windows across all sessions.
$ tmux set -g window-style 'fg=#171421,bg=#ffffff'
$ # Change the colours of the current pane only.
$ tmux set -p window-style 'fg=#171421,bg=#ffffff'

There’s also a window-active-style setting that you can use to highlight the active pane by giving it a different background colour than the other panes.

This all requires your terminal emulator to have a colour palette that works on either a light or a dark background. I’m using the default colour palette from GNOME Terminal (as of GNOME 3.38):

Palette entry 0 #171421
Palette entry 1 #C01C28
Palette entry 2 #26A269
Palette entry 3 #A2734C
Palette entry 4 #12488B
Palette entry 5 #A347BA
Palette entry 6 #2AA1B3
Palette entry 7 #D0CFCC
Palette entry 8 #5E5C64
Palette entry 9 #F66151
Palette entry 10 #33DA7A
Palette entry 11 #E9AD0C
Palette entry 12 #2A7BDE
Palette entry 13 #C061CB
Palette entry 14 #33C7DE
Palette entry 15 #FFFFFF
Cursor and highlight background #D0CFCC
Cursor and highlight foreground #171421

As you can see from the script my dark mode background and foreground colours are #D0CFCC on #171421 and light mode is #171421 on #FFFFFF.

All posts tagged “tmux”: