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
.