Automatic Switching Between Light and Dark Solarized Modes

I've recently switched to using the solarized color theme. At first it took getting used to the lower contrast; however, I was persuaded to keep trying based on the research behind the choice of the colors. I'm now quite happy with it.

With solarized there are 2 mode of operation, light mode and dark mode. These modes have the somewhat obvious meanings, light mode uses a light background with darker text, and dark mode uses a dark background with light text. I like both modes, and find that the dark mode is well suited to nighttime use and likewise the light mode is good for daytime.

So the next question was how to make this automatic. I use iTerm on the Mac so I created 2 profiles 1 for each mode and gave each profile a hot key. But what about when the sun sets or rises and I've got windows open? Also I use different colors for the TMUX status bar depending on the mode, I'd like those long running sessions to update as well depending on the time of the day.

In order to update running programs I created a shell script (which also uses applescript if iTerm is running) to update both iTerm and TMUX based on an hour range. I then execute this script once an hour using crontab.

One of the features of solarized is that the only difference between the light and dark modes is the choices for foreground color and background color. So we only have to swap those two values. I also change the color of the text behind the cursor.

Update color mode shell script.


# Set Color Values

darkend=600             # 6am
darkstart=2000          # 10pm
timeval="$(date +%k%M)" # current time

if [ $timeval -gt $darkend -a $timeval -lt $darkstart ]; then
    # Dark Mode
    itermcolors='{{64842, 62778, 56626}, {21257, 26684, 28737}, {60037, 58326, 52284}}'
    # Light Mode
    itermcolors='{{0, 7722, 9941}, {28873, 33398, 33872}, {0, 10207, 12694}}'

# Adjust iTerm

if [ -n "$(ps x | grep iTerm | grep -v grep)" ]; then
    osascript <<- EOF
    tell application "iTerm"
	repeat with aSession in sessions of current terminal
	    tell aSession
		set theColors to $itermcolors
		set background color to item 1 of theColors
		set foreground color to item 2 of theColors
		set cursor_text color to item 3 of theColors
	    end tell
	end repeat
    end tell

# Adjust TMUX

sessions="$(tmux ls 2>/dev/null | cut -f1 -d:)"
for s in $sessions; do
    tmux set-window-option -t $s -g window-status-current-fg $tmux_cur_fg > /dev/null
    tmux set-window-option -t $s -g status-bg $tmux_bg > /dev/null

Crontab entry

0 * * * * /users/chopps/bin/