Follow light/dark appearance in the tmux status bar
The status bar was five hardcoded tangere-dark colours, so in light mode the
pale #fdfdd9 text landed on a white background and became unreadable. That was
the real reason Auto appearance "never worked with the terminal setup" — ghostty
was switching correctly all along.
Split the colours into tmux-light.conf and tmux-dark.conf. The dark file is
extracted byte-exact from the previous config; the light file is the same layout
with each colour swapped for the tangere-light palette entry at the same index,
so roles are preserved (text on an accent uses the theme background, which
inverts from #1a2938 to #fdfdfa).
tmux 3.6+ learns the terminal's theme over OSC 2031, so this keys off the
appearance change itself rather than a schedule, and behaves identically whether
that came from Auto at sunrise/sunset or a manual toggle. Three hooks: the two
theme hooks react to a change, and client-attached covers a client attaching
mid-way, since those two only fire on a change. Sourcing is idempotent so the
overlap is harmless.
This replaces the dark-mode-notify launchd agent removed in 59d5622, which could
not have worked: it re-sourced .zshrc inside each shell, but the status bar
belongs to the tmux server.
Verified by round trip: flipping to Light switched #{client_theme} and applied
the light palette, and returning to Dark restored it. A running nvim does not
follow a live change (docs: the TUI sets 'background' on startup); noted in the
README.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
59d5622442
commit
6b3ab420ad
5 changed files with 73 additions and 17 deletions
22
README.md
22
README.md
|
|
@ -68,12 +68,24 @@ Most of this is now handled natively and needs no configuration:
|
||||||
- **bat** picks a theme per invocation from `BAT_THEME_LIGHT` / `BAT_THEME_DARK`.
|
- **bat** picks a theme per invocation from `BAT_THEME_LIGHT` / `BAT_THEME_DARK`.
|
||||||
- **delta** and **nvim** detect the terminal background themselves.
|
- **delta** and **nvim** detect the terminal background themselves.
|
||||||
|
|
||||||
Still outstanding: the tmux status bar is hardcoded to dark-tuned colours, so it
|
The tmux status bar needs help, because its colours are set explicitly. They live
|
||||||
is unreadable in light mode. tmux has `client-light-theme` and
|
in `tmux-light.conf` and `tmux-dark.conf` — the same layout, with each colour
|
||||||
`client-dark-theme` hooks for exactly this — not yet wired up.
|
taken from the matching tangere palette index — and `tmux` sources one of them
|
||||||
|
from three hooks:
|
||||||
|
|
||||||
Both machines currently run pinned Dark, so the delta and nvim behaviour above is
|
- `client-light-theme` / `client-dark-theme` react to a change,
|
||||||
documented-but-untested here. Worth re-checking when Auto goes back on.
|
- `client-attached` picks the right one for a client that attaches mid-way, since
|
||||||
|
the two above only fire on a change.
|
||||||
|
|
||||||
|
Because this keys off the terminal's reported theme rather than a schedule, it
|
||||||
|
behaves identically whether the change came from Auto at sunrise/sunset or from
|
||||||
|
toggling Light/Dark by hand — nothing in the chain knows why it changed.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> A running nvim will not follow a live change: the docs are explicit that the
|
||||||
|
> TUI sets `background` *on startup* if it can detect it. New instances are
|
||||||
|
> fine; existing ones need `:set background=light` or a restart. delta is
|
||||||
|
> per-invocation so should be fine, but that is untested here.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> This previously used [`dark-mode-notify`](https://github.com/bouk/dark-mode-notify)
|
> This previously used [`dark-mode-notify`](https://github.com/bouk/dark-mode-notify)
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ echo "Sym-linking the various config files"
|
||||||
test -L $HOME/.gitignore || ln -f -s $BASEDIR/gitignore $HOME/.gitignore
|
test -L $HOME/.gitignore || ln -f -s $BASEDIR/gitignore $HOME/.gitignore
|
||||||
test -L $HOME/.hushlogin || ln -f -s $BASEDIR/hushlogin $HOME/.hushlogin
|
test -L $HOME/.hushlogin || ln -f -s $BASEDIR/hushlogin $HOME/.hushlogin
|
||||||
test -L $HOME/.tmux.conf || ln -f -s $BASEDIR/tmux $HOME/.tmux.conf
|
test -L $HOME/.tmux.conf || ln -f -s $BASEDIR/tmux $HOME/.tmux.conf
|
||||||
|
test -L $HOME/.tmux-light.conf || ln -f -s $BASEDIR/tmux-light.conf $HOME/.tmux-light.conf
|
||||||
|
test -L $HOME/.tmux-dark.conf || ln -f -s $BASEDIR/tmux-dark.conf $HOME/.tmux-dark.conf
|
||||||
test -d $HOME/.config/sheldon || mkdir $HOME/.config/sheldon
|
test -d $HOME/.config/sheldon || mkdir $HOME/.config/sheldon
|
||||||
test -L $HOME/.config/sheldon/plugins.toml || ln -f -s $BASEDIR/sheldon.toml $HOME/.config/sheldon/plugins.toml
|
test -L $HOME/.config/sheldon/plugins.toml || ln -f -s $BASEDIR/sheldon.toml $HOME/.config/sheldon/plugins.toml
|
||||||
test -L $HOME/.zsh || ln -f -s $BASEDIR/zsh $HOME/.zsh
|
test -L $HOME/.zsh || ln -f -s $BASEDIR/zsh $HOME/.zsh
|
||||||
|
|
|
||||||
23
tmux
23
tmux
|
|
@ -33,9 +33,6 @@ set -g default-terminal "$TERM"
|
||||||
# Allow OSC 8 links
|
# Allow OSC 8 links
|
||||||
set -ga terminal-features "*:hyperlinks"
|
set -ga terminal-features "*:hyperlinks"
|
||||||
|
|
||||||
# Tweak status bar styles
|
|
||||||
set -g status-style bg=default,fg='#fdfdd9'
|
|
||||||
|
|
||||||
# Set status bar length
|
# Set status bar length
|
||||||
set -g status-left-length 40
|
set -g status-left-length 40
|
||||||
set -g status-right-length 60
|
set -g status-right-length 60
|
||||||
|
|
@ -43,14 +40,16 @@ set -g status-right-length 60
|
||||||
# Center the window list
|
# Center the window list
|
||||||
set -g status-justify centre
|
set -g status-justify centre
|
||||||
|
|
||||||
# Left side: session name with blue accent
|
# Status bar colours live in ~/.tmux-light.conf and ~/.tmux-dark.conf. tmux
|
||||||
set -g status-left "#[fg=#1a2938,bg=#8fb4cd,bold] #S #[fg=#8fb4cd,bg=default]\ue0b0"
|
# learns the terminal's theme over OSC 2031, so this reacts to the appearance
|
||||||
|
# change itself, whether that came from Auto at sunrise/sunset or a manual
|
||||||
|
# toggle, since nothing here knows why it changed.
|
||||||
|
set-hook -g client-light-theme 'source-file ~/.tmux-light.conf'
|
||||||
|
set-hook -g client-dark-theme 'source-file ~/.tmux-dark.conf'
|
||||||
|
|
||||||
# Right side: multi-segment with transitions
|
# Those hooks only fire on a change, so also pick the right palette whenever a
|
||||||
set -g status-right "#[fg=#6dafb5,bg=default]\ue0b2#[fg=#1a2938,bg=#6dafb5] %H:%M #[fg=#bb98d9,bg=#6dafb5]\ue0b2#[fg=#1a2938,bg=#bb98d9] %d-%b "
|
# client attaches. Sourcing is idempotent, so the overlap is harmless.
|
||||||
|
set-hook -g client-attached 'if -F "#{==:#{client_theme},light}" "source-file ~/.tmux-light.conf" "source-file ~/.tmux-dark.conf"'
|
||||||
|
|
||||||
# Inactive windows (no powerline symbols)
|
# Default before any client has attached and reported a theme.
|
||||||
setw -g window-status-format "#[fg=#2f4656,bg=default] #I #W "
|
source-file ~/.tmux-dark.conf
|
||||||
|
|
||||||
# Active window (cyan highlight, no powerline)
|
|
||||||
setw -g window-status-current-format "#[fg=#1a2938,bg=#6dafb5,bold] #I #W "
|
|
||||||
|
|
|
||||||
21
tmux-dark.conf
Normal file
21
tmux-dark.conf
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# tangere-dark status bar, sourced by the client-dark-theme hook in ~/.tmux.conf
|
||||||
|
#
|
||||||
|
# Colours are tangere-dark palette entries so the bar matches the ghostty theme.
|
||||||
|
# Text sitting on an accent uses the theme background (#1a2938).
|
||||||
|
# #fdfdd9 foreground #1a2938 background #2f4656 dim (15)
|
||||||
|
# #8fb4cd blue (4) #6dafb5 cyan (2) #bb98d9 magenta (5)
|
||||||
|
|
||||||
|
# Tweak status bar styles
|
||||||
|
set -g status-style bg=default,fg='#fdfdd9'
|
||||||
|
|
||||||
|
# Left side: session name with blue accent
|
||||||
|
set -g status-left "#[fg=#1a2938,bg=#8fb4cd,bold] #S #[fg=#8fb4cd,bg=default]\ue0b0"
|
||||||
|
|
||||||
|
# Right side: multi-segment with transitions
|
||||||
|
set -g status-right "#[fg=#6dafb5,bg=default]\ue0b2#[fg=#1a2938,bg=#6dafb5] %H:%M #[fg=#bb98d9,bg=#6dafb5]\ue0b2#[fg=#1a2938,bg=#bb98d9] %d-%b "
|
||||||
|
|
||||||
|
# Inactive windows (no powerline symbols)
|
||||||
|
setw -g window-status-format "#[fg=#2f4656,bg=default] #I #W "
|
||||||
|
|
||||||
|
# Active window (cyan highlight, no powerline)
|
||||||
|
setw -g window-status-current-format "#[fg=#1a2938,bg=#6dafb5,bold] #I #W "
|
||||||
22
tmux-light.conf
Normal file
22
tmux-light.conf
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
# tangere-light status bar, sourced by the client-light-theme hook in ~/.tmux.conf
|
||||||
|
#
|
||||||
|
# Same layout as tmux-dark.conf, with each colour swapped for the tangere-light
|
||||||
|
# palette entry at the same index. Roles are preserved: text on an accent uses
|
||||||
|
# the theme background, which is now light rather than dark.
|
||||||
|
# #000000 foreground #fdfdfa background #d1d1d1 dim (15)
|
||||||
|
# #223355 blue (4) #004c73 cyan (2) #663d52 magenta (5)
|
||||||
|
|
||||||
|
# Tweak status bar styles
|
||||||
|
set -g status-style bg=default,fg='#000000'
|
||||||
|
|
||||||
|
# Left side: session name with blue accent
|
||||||
|
set -g status-left "#[fg=#fdfdfa,bg=#223355,bold] #S #[fg=#223355,bg=default]\ue0b0"
|
||||||
|
|
||||||
|
# Right side: multi-segment with transitions
|
||||||
|
set -g status-right "#[fg=#004c73,bg=default]\ue0b2#[fg=#fdfdfa,bg=#004c73] %H:%M #[fg=#663d52,bg=#004c73]\ue0b2#[fg=#fdfdfa,bg=#663d52] %d-%b "
|
||||||
|
|
||||||
|
# Inactive windows (no powerline symbols)
|
||||||
|
setw -g window-status-format "#[fg=#d1d1d1,bg=default] #I #W "
|
||||||
|
|
||||||
|
# Active window (cyan highlight, no powerline)
|
||||||
|
setw -g window-status-current-format "#[fg=#fdfdfa,bg=#004c73,bold] #I #W "
|
||||||
Loading…
Reference in a new issue