Last active
March 25, 2024 04:03
-
-
Save plivox/c5297dd8b350baa582895684bfb0aded to your computer and use it in GitHub Desktop.
Automatic iTerm2 preset switching on MacOS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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") |
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.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Great stuff, and thanks for sharing your work! π₯ π
Just a small observation:
THEME_LIGHT
andTHEME_DARK
are actually used to select colour presets. What about renaming them toCOLOUR_PRESET_LIGHT
andCOLOUR_PRESET_DARK
?