Time controlled colour schemes for Vim and Iterm2

Published on May 26th 2020
A screenshot of a computer screen
If you have read any of my other articles, you will know that I live in a terminal. All my work is done in Iterm2, using NeoVim, Tmux and a multitude of other tools. You will probably also know that I have taken the time to get my terminal and Vim looking just how I like it. I have written a theme (Ariake) for both Iterm2 and Vim with light and dark variants.
The reason for the light and dark variants are to help with working through the day into the evening. During the day, I find it easier on the eyes to have a light theme. In the evening, a dark is better. But I would rarely remember to make the switch. I figured there must be a way to automate the process. It turned out to be pretty straightforward.

Setting up Vim

The update to Vim was super simple. Simply add the following lines 'to your init.vim'
1if strftime("%H") < 17
2 set background=light
4 set background=dark
This follows the 24hr clock so update the 17 (5 pm) accordingly. I have mine change at around 5 pm. Now every time you openVim the time would be checked and the background colour updated accordingly.

Setting up Iterm2

This was a little more involved but nothing to hard. Iterm2 gives the user access to a Python API. With this, we have access to a huge array of functionality and so we can programmatically update it. In our case, we want to update the colour schema of our profile.
From the menu select Scripts > New Python Script and follow the wizard. It does not matter what you select as we are gonna replace the whole lot anyway. Once you have completed the wizard, open the script and replace the contents with the script below.
1#!/usr/bin/env python3.7
3import asyncio
4import datetime
5import iterm2
7# Clock time to change colours.
8LIGHT_TIME=(7, 0)
9DARK_TIME=(17, 0)
11# Color presets to use
15# Profiles to update
18def datetime_after(t, time):
19 today = datetime.datetime(t.year, t.month, t.day, time[0], time[1])
20 if today > t:
21 return today
22 # Same time tomorrow
23 return today + datetime.timedelta(1)
26def next_deadline_after(t):
27 light_deadline = datetime_after(t, LIGHT_TIME)
28 dark_deadline = datetime_after(t, DARK_TIME)
29 print("light {} dark {}".format(light_deadline, dark_deadline))
30 if light_deadline < dark_deadline:
31 return (LIGHT_PRESET_NAME, light_deadline)
32 return (DARK_PRESET_NAME, dark_deadline)
34def get_duration():
35 now = datetime.datetime.now()
36 preset_name, deadline = next_deadline_after(now)
37 duration = (deadline - now).seconds
38 print("Sleep for {} seconds until {}".format(duration, deadline))
39 return duration, preset_name
41async def set_colors(connection, preset_name):
42 print("Change to preset {}".format(preset_name))
43 preset = await iterm2.ColorPreset.async_get(connection, preset_name)
44 for partial in (await iterm2.PartialProfile.async_query(connection)):
45 if partial.name in PROFILES:
46 await partial.async_set_color_preset(preset)
48async def main(connection):
49 while True:
50 duration, preset_name = get_duration()
51 await asyncio.sleep(duration)
52 await set_colors(connection, preset_name)
53 await asyncio.sleep(1)
The only things that need changing are marked with comments. I found the script console handy for debugging the scripts. Once the script is complete you can activate it Scripts > . If you want it to run automatically, move the script to $HOME/Library/ApplicationSupport/iTerm2/Scripts/AutoLaunch. You may need to create this folder.
Now that the scripts are in place, you should have a lovely self-changing development environment allowing you to code all day and night 😀.
Free download for your phone or tablet
Download on the App StoreGet it on Google Play

Lots to see

Follow and read AlanGardenMaster’s articles as he develops his new one-acre plot. PimlicoDan shows city gardening in a whole new light, or follow DaisyDays on her adventures in the allotment and as a professional gardener. Just a few of the many personalities you’ll meet in our app. Free download for your phone or tablet.
Download on the App StoreGet it on Google Play


Subscribe for the latest updates from Candide

What is Candide?

Candide has everything for plant lovers – buy plants from independent sellers and book tickets to visit inspiring gardens near you. Identify plants in seconds from a single photo and learn how to care for them with our in-depth guides.


Learn how to care for your plants and share your growing successes on Candide’s free app for your phone or tablet.

Download on the App StoreGet it on Google Play

Germinated in Bristol © 2021 Candide