Skip to content

Instantly share code, notes, and snippets.

@jsynowiec
Last active March 5, 2024 06:06
Show Gist options
  • Save jsynowiec/cfe75c14761f8c903cb2376ac912fb9f to your computer and use it in GitHub Desktop.
Save jsynowiec/cfe75c14761f8c903cb2376ac912fb9f to your computer and use it in GitHub Desktop.
Sync iTerm2 color preset with macOS dark or light theme on start and when theme changes.
#!/usr/bin/env python3
"""Set iTerm2 color preset according to macOS theme.
Requires iTerm2 version 3.3 or newer.
Save as ~/Library/ApplicationSupport/iTerm2/Scripts/AutoLaunch/sync_theme.py and
enable under scripts menu in iTerm2.
"""
import asyncio
import iterm2
# Change according to your preferences
LIGHT_COLOR_PRESET = 'Tango Light'
DARK_COLOR_PRESET = 'Tango Dark'
async def set_theme(connection: iterm2.connection.Connection, dark: bool):
preset = await iterm2.ColorPreset.async_get(
connection,
DARK_COLOR_PRESET if dark else LIGHT_COLOR_PRESET,
)
# Update the list of all profiles and iterate over them.
profiles = await iterm2.PartialProfile.async_query(connection)
for partial in profiles:
# Fetch the full profile and then set the color preset in it.
profile = await partial.async_get_full_profile()
await profile.async_set_color_preset(preset)
async def sync_theme_on_start(connection: iterm2.connection.Connection):
app = await iterm2.app.async_get_app(connection)
theme = await app.async_get_theme()
await set_theme(connection, 'dark' in theme)
async def main(connection: iterm2.connection.Connection):
await sync_theme_on_start(connection)
async with iterm2.VariableMonitor(
connection, iterm2.VariableScopes.APP, 'effectiveTheme', None,
) as mon:
while True:
# Block until theme changes
theme: str = await mon.async_get()
# Themes have space-delimited attributes, one of which will be light or dark.
parts = theme.split(' ')
await set_theme(connection, 'dark' in parts)
iterm2.run_forever(main)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment