Python API

Python API #

这部分主要介绍 iTerm2 提供的 Python API,利用它,带你实现一些不一样的能力。我将演示两个案例,分别是背景图自动更换和分屏创建自动化。

自动更换背景图 #

编程枯燥无味,想通过背景图为枯燥生活提供一些趣味。假设,我们要设计一个脚本,给终端一小时自动更好一个背景图。

假设我的壁纸图片都在 ~/Public/images/beauties 目录下。

实现下这个代码,如下所示:

import iterm2
import random
import os
import asyncio
import sys


# 替换背景图片的函数
async def change_background(session, image_path):
    # 获取当前会话的配置文件
    profile = await session.async_get_profile()

    # 设置透明度,值在0(完全透明)到1(完全不透明)之间
    await profile.async_set_transparency(0.2)  # 设置为50%透明度
    # 设置背景图像位置
    await profile.async_set_background_image_location(image_path)


async def main(connection):
    app = await iterm2.async_get_app(connection)
    window = app.current_terminal_window

    if window is None:
        return

    session = window.current_tab.current_session

    # 获取脚本参数提供的目录
    directory = sys.argv[1] if len(sys.argv) > 1 else "."
    if not os.path.isdir(directory):
        raise ValueError(f"Provided path {directory} is not a directory")

    while True:  # 创建无限循环以定期更换背景
        # 获取目录中的所有图片文件
        image_files = [
            os.path.join(directory, f)
            for f in os.listdir(directory)
            if f.lower().endswith((".png", ".jpg", ".jpeg", ".tiff", ".bmp", ".gif"))
        ]

        if image_files:
            # 随机选择一张图片
            chosen_image = os.path.abspath(random.choice(image_files))
            # 调用函数更改背景
            await change_background(session, chosen_image)
        else:
            print(f"No images found in directory {directory}")

        # 等待一个小时
        await asyncio.sleep(3600)


iterm2.run_until_complete(main)

代码中提供了注释说明,不熟悉 Python 直接考虑即可,命令的接收参数是存放图片的目录。

定时能力,我们是通过 sleep(3600) 实现每小时随机更换背景图片。特别说明,不要用 crontab,因为存在环境上下文问题,crontab 无法知道 iTerm2 的存在。

这个脚本可以放在 sh 的启动脚本中,如 bashrczshrc 等,这取决于你用什么 shell。我们只要将其设置为后台常驻的形式运行,

python random-bg.py your-images-directory &

我假设将它设置为 1 秒换一次图片,效果如下所示:

布局自动化 #

如果你用 tmux 的话,可能知道有些布局管理工具,如 tmuxifier 和 tmuxinator, 可自动创建布局。其实,只用 iTerm2,同样可实现这样的功能。

因为 iTerm2 的 Python API 提供了创建分屏的接口。

示例代码如下所示:

import iterm2

async def main(connection):
    app = await iterm2.async_get_app(connection)
    window = app.current_terminal_window
    if window is None:
        print("No current window")
        return

    session = window.current_tab.current_session
    # 垂直分屏
    await session.async_split_pane(vertical=True)
    # 如果你想要水平分屏,将vertical参数设置为False
    # await session.async_split_pane(vertical=False)

iterm2.run_until_complete(main)

重点就是那句 await session.async_split_pane(vertical=True),执行这个角度会自动进行左右分屏,即垂直分屏。

演示效果如下:

假设,你想自定义一些布局的话,如前面提到这个效果,如下所示:

我们来实现一个命令自动创建这个效果。

需求详细描述,iTerm2 自动创建三个 pane 的布局,左边 pane 用于通过 vim 命令打开指定目录(IDE 写代码),右边上下两个 pane 中,上面的 pane 执行 go run *.go 命令,下面的 pane 创建清空等待输入。

编写这样一个脚本来实现这个流程,代码如下:

import iterm2
import sys


async def main(connection):
    # 获取要打开的目录作为参数
    directory = sys.argv[1] if len(sys.argv) > 1 else "."

    app = await iterm2.async_get_app(connection)
    window = app.current_terminal_window

    if window is not None:
        # 创建左边的pane
        left_session = window.current_tab.current_session
        await left_session.async_send_text(f"cd {directory}\n")
        await left_session.async_send_text("vim\n")

        # 创建右边的pane
        # 右上的pane保持空白
        top_right_session = await left_session.async_split_pane(vertical=True)
        await top_right_session.async_send_text("\clear\n")
        await top_right_session.async_send_text("go run *.go\n")

        # 在右下的pane执行go run *.go
        bottom_right_session = await top_right_session.async_split_pane(vertical=False)
        await bottom_right_session.async_send_text("\clear\n")

    else:
        print("No current window")

iterm2.run_until_complete(main)

就不啰嗦代码逻辑了,非常简单。

命令效果,如下所示:

Python API 的使用就演示这两个案例。想了解它的更多能力,可直接查看它的官方文档,访问 iTemr2 Python API Documentation