#!/usr/bin/env python3 | |
import asyncio | |
import iterm2 | |
THEME_LIGHT = "Tango Light" | |
THEME_DARK = "Tango Dark" | |
class AutoSwitchTheme: | |
def __init__(self, connection, light="Light Background", dark="Dark Background"): | |
self.connection = connection | |
self.light = light | |
self.dark = dark | |
async def get_app(self): | |
return await iterm2.async_get_app(self.connection) | |
async def get_theme(self) -> str: | |
parts = await (await self.get_app()).async_get_theme() | |
if len(parts) <= 1: | |
return parts[0] | |
return "" | |
async def set_color_preset(self, theme): | |
preset = await iterm2.ColorPreset.async_get( | |
self.connection, self.light if theme == "light" else self.dark | |
) | |
profiles = await iterm2.PartialProfile.async_query(self.connection) | |
for partial in profiles: | |
await (await partial.async_get_full_profile()).async_set_color_preset( | |
preset | |
) | |
async def quit(connection): | |
while True: | |
if not connection.websocket.open: | |
exit(0) | |
await asyncio.sleep(1) | |
async def main(connection): | |
asyncio.ensure_future(quit(connection), loop=asyncio.get_event_loop()) | |
ast = AutoSwitchTheme(connection, THEME_LIGHT, THEME_DARK) | |
await ast.set_color_preset(await ast.get_theme()) | |
async with iterm2.VariableMonitor( | |
connection, iterm2.VariableScopes.APP, "effectiveTheme", None | |
) as mon: | |
while True: | |
# Block until theme changes | |
theme = await mon.async_get() | |
# Set preset if theme has changed | |
await ast.set_color_preset(theme) | |
try: | |
iterm2.run_forever(main) | |
except: | |
print("Unable to connect on iTerm2 application") |
@plivox I am having an issue where the script is running if I do it manually through the scripts menu, but even though it is here: $HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/auto_switch_theme.py
- it doesn't seem to be running automatically. Do you have any idea what I might be doing wrong?
EDIT: Solved. You have to check "Enable Python API in Preferences"->General->Magic
@dasizeman, Yes, you have to activate the Python API in the preferences π
Thanks @plivox! Another thing I noticed is that was giving me trouble is that it doesn't seem to work with iTerm's minimal theme (which I really like π’ ). Do you have any ideas if this is something we could improve on the script side or is it possibly an issue with the API being inconsistent for that theme?
Great stuff, and thanks for sharing your work! π₯ π
Just a small observation: THEME_LIGHT
and THEME_DARK
are actually used to select colour presets. What about renaming them to COLOUR_PRESET_LIGHT
and COLOUR_PRESET_DARK
?
Thanks @plivox! Another thing I noticed is that was giving me trouble is that it doesn't seem to work with iTerm's minimal theme (which I really like π’ ). Do you have any ideas if this is something we could improve on the script side or is it possibly an issue with the API being inconsistent for that theme?
Same issue. When switch to compact theme all work fine.
Thanks for this!
Jazakallahu Khairan πβ€οΈ
Thanks for this one!!
Thank you all for your feedback. As @stefanwascoding writes, the latest beta (3.5) includes separate color settings.
@SinisterStairs, with pleasure and thanks for the feedback.