ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

iTerm2 Python 脚本示例全解:从状态栏组件到 Tmux 集成的一站式实战指南

iTerm2 Python 脚本示例全解:从状态栏组件到 Tmux 集成的一站式实战指南 桌面应用AI 应用【免费下载链接】iTerm2iTerm2 is a terminal emulator for Mac OS X that does amazing things.项目地址https://gitcode.com/gh_mirrors/it/iTerm2点击查看免费下载本文以 iTerm2 官方 Python API 文档中的示例脚本目录api/library/python/iterm2/docs/examples/index.rst为核心系统梳理该仓库为开发者提供的全部示例脚本分类会话标题提供器、自定义状态栏组件、Tmux 集成、事件监听、配色方案、窗口标签管理、键盘钩子、输入广播等。读完本文你将掌握 iTerm2 脚本的安装路径、注册机制run_forever/run_until_complete、核心异步 API 用法并能够直接参照源码级示例动手编写自己的自动化脚本。一、示例脚本目录一份按功能分类的抄作业清单官方文档在examples/index.rst中这样定位这批脚本Here are a collection of working scripts for you to crib from——这是一批开箱即用的可运行脚本集合虽然每个脚本按其主功能归类但不少脚本同时演示了多种脚本特性。官方建议开发者直接在这份清单中搜索需求或顺着各 API 文档中的See Also章节找到演示特定 API 的示例。这份目录按主题分为 16 个大类、约 60 个脚本可运行代码分散在同目录下的.its/.py文件中如 statusbar.its、launch_and_run.py。整体分类如下分类示例脚本核心 API / 概念Session Title Providersgeorges_title、badgetitleTitleProviderRPC、变量引用Status Bar Componentsstatusbar、escindicator、jsonpretty、mousemode、gmtclock、diskspace、unread、weather、venvStatusBarComponent、StatusBarRPC、CheckboxKnob、KeystrokeMonitorTmuxtmux、tileasync_get_tmux_connections、async_create_windowMonitoring for Eventsrandom_color、colorhost、fs-only-status-bar、theme、copycolor、tabtitle、autoalert、stty、app_tab_color、sync_title事件/变量监听、颜色预设Profiles and Color Presetscurrent_preset、blending、settabcolor、increase_font_size、resizeall、change_default_profile、setprofileasync_set_profile、局部 Profile、RPC注册Standalone Scriptsset_title_forever、launch_and_run、runcommand命令行启动、async_create窗口Keyboardfunction_key_tabsKeystrokeMonitor、按键行为改写Broadcasting Inputenable_broadcasting、broadcast广播域Broadcast Domains、输入过滤Windows and Tabsmovetab、apply_layout、sorttabs、mrutabs、mrutabs2、findps、tab_group_testasync_apply_layout、标签组 APIAsyncioclose_to_the_right、darknightasyncio.gather、定时任务Custom Toolbelt Toolstargeted_inputiterm2.Tool自定义工具Custom Context Menu Itemssumselection右键菜单扩展Selectionzoom_on_screen菜单选择与选区修改Othercls、create_window、ccs、oneshot、open_browser_tab函数注册、控制序列注入、模态弹窗二、脚本的运行环境与两种生命周期模式所有脚本都基于iterm2Python 库即当前仓库 api/library/python/iterm2 所构建的包并通过两种入口函数运行iterm2.run_forever(main)脚本常驻运行daemon适合状态栏组件、键盘监听这类需要持续响应的场景。文档特别说明此类脚本应放入 AutoLaunch 文件夹随 iTerm2 启动自动加载。iterm2.run_until_complete(main, keep_trying)脚本执行完毕即退出适合一次性操作如创建窗口、执行命令。第二个参数传True表示持续尝试连接直到 iTerm2 启动完成。2.1 脚本安装位置按照 launch_and_run.rst 的说明从命令行运行脚本需要先安装依赖brew install python3 pip3 install iterm2 pip3 install pyobjc # 仅当脚本需要操作 macOS 应用层如启动 iTerm2时长驻脚本则放置在~/Library/Application Support/iTerm2/Scripts/AutoLaunch目录下启动后可通过Scripts AutoLaunch 脚本名手动触发或重启 iTerm2 自动加载。2.2 从命令行启动 iTerm2 并执行命令launch_and_run是Standalone Scripts中最具代表性的一例它同时演示了两件事用 PyObjC 启动 iTerm2 应用以及创建一个运行指定命令的新窗口#!/usr/bin/env python3 import iterm2 import AppKit # 1. 启动 App适用于从命令行而非 iTerm2 内部运行脚本的场景 AppKit.NSWorkspace.sharedWorkspace().launchApplication_(iTerm2) async def main(connection): app await iterm2.async_get_app(connection) # 2. 将应用置前 await app.async_activate() # 3. 通过 shell 启动 vi经 bash -l 可继承 $PATH无需写全路径 await iterm2.Window.async_create(connection, command/bin/bash -l -c vi) # 4. 第二个参数 True一直重试连接直到 App 启动就绪 iterm2.run_until_complete(main, True)关键点Window.async_create(command...)允许直接以命令创建新窗口而run_until_complete(main, True)的第二个参数保证了App 尚未启动时脚本不会因连接失败而崩溃。三、Session Title Providers自定义会话标题标题提供器Title Provider是 iTerm2 脚本化中应用面最广的功能之一核心装饰器为iterm2.registration.TitleProviderRPC。3.1 简单示例把 Badge 写进 Tab 标题badgetitle.rst 演示了最简标题提供器将 Badge徽标名称拼入标签页标题。运行脚本后在Prefs Profiles General Title中选择Badge Name即可生效iterm2.TitleProviderRPC async def badge_title( badgeiterm2.Reference(badge?), auto_nameiterm2.Reference(autoName?)): if badge and auto_name: return auto_name u \u2014 badge elif auto_name: return auto_name elif badge: return badge else: return Shell await badge_title.async_register(connection, Name Badge, com.iterm2.example.name-and-badge)同样的模式还衍生出窗口标题同步到标签页的变体windowtitle.its当应用只设置窗口标题terminalWindowName而不设置标签标题时把它也显示到标签上。3.2 复杂示例Georges Title Algorithm含 Git 分支georges_title.rst 是文档中标注为复杂会话标题提供器的旗舰示例它把Shell Integration 用户变量与自定义标题函数组合起来最终产出一个包含主机名、路径、Git 分支和图标的精美标题。第一步安装 Shell Integration 并在.bashrc中定义用户变量function iterm2_print_user_vars() { iterm2_set_user_var gitBranch $((git branch 2 /dev/null) | grep \* | cut -c3-) iterm2_set_user_var home $(echo -n $HOME) }第二步将脚本放入 AutoLaunch 目录并注册标题提供器iterm2.TitleProviderRPC async def georges_title( pwditerm2.Reference(path?), hostnameiterm2.Reference(hostname?), branchiterm2.Reference(user.gitBranch?), auto_nameiterm2.Reference(autoName?), profile_nameiterm2.Reference(profileName?), tmux_titleiterm2.Reference(tmuxWindowTitle?), user_homeiterm2.Reference(user.home?)): if tmux_title: return tmux_title parts [make_title(auto_name, profile_name), make_hostname(hostname, localhost), make_pwd(user_home, localhome, pwd), make_branch(branch)] return .join(list(filter(lambda x: x, parts))) await georges_title.async_register( connection, display_nameGeorges Title Algorithm, unique_identifiercom.iterm2.example.georges-title-algorithm)第三步在Prefs Profiles General Title中选择Georges Title Algorithm。这个示例的关键知识点iterm2.Reference(path?)的?后缀表示变量可选当变量尚未定义如新会话刚创建时不会抛异常这是文档反复强调的防御性写法标题的各组成部分由辅助函数make_title、make_hostname、make_pwd、make_branch分头生成再过滤空值拼接体现了组合式标题构建的工程化思路用户通过iterm2_set_user_var定义的变量以user.前缀在 Python 侧读取如user.gitBranch这正是 variables.rst 所描述的变量命名空间体系。四、Status Bar Components自定义状态栏组件这是示例数量最多的类别9 个核心 API 是iterm2.StatusBarComponentiterm2.StatusBarRPC。通用安装流程以 statusbar.rst 为准启动脚本后进入Preferences Profiles Session打开Status Bar Enabled→ 点击Configure Status Bar将组件拖入状态栏区域选中后点击Configure Component即可调整配置项。4.1 基础组件 配置旋钮Knobstatusbar示例演示了带可配置旋钮knob的变长文本组件当开启 Variable-Length Demo 旋钮时组件会根据可用宽度自动切换文本从完整句子逐步缩短到 Its getting tight关闭时显示rows x cols尺寸import iterm2 async def main(connection): vl variable_length_demo knobs [iterm2.CheckboxKnob(Variable-Length Demo, False, vl)] component iterm2.StatusBarComponent( short_descriptionStatus Bar Demo, detailed_descriptionTests script-provided status bar components, knobsknobs, exemplarrow x cols, update_cadenceNone, # None 表示仅在依赖变量变化时更新 identifiercom.iterm2.example.status-bar-demo) iterm2.StatusBarRPC async def coro( knobs, rowsiterm2.Reference(rows), colsiterm2.Reference(columns)): if vl in knobs and knobs[vl]: return [This is an example of variable-length status bar components, This is a demo of variable-length status bar components, ..., Its getting tight] return {}x{}.format(rows, cols) await component.async_register(connection, coro) iterm2.run_forever(main)要点knobs参数CheckboxKnob(显示名, 默认值, 内部key)定义配置项用户在图层面板修改后通过knobs[key]读取返回值列表即变长候选集状态栏在空间不足时自动从列表中选择更短的文本这是实现自适应宽度的标准手法update_cadence设为None表示由变量驱动更新设为数字秒则周期刷新该脚本是长驻 daemon官方明确要求放入 AutoLaunch 目录。4.2 键盘监听 变量作为脚本内部通信通道escindicator.rst 是文档中含金量最高的示例之一演示了四件事自定义状态栏组件、键盘监听、用用户变量作为脚本内部模块间的回程通道back-channel、以及 asyncio 任务调度与取消。counter 0 async def main(connection): app await iterm2.async_get_app(connection) tasks {} component iterm2.StatusBarComponent( short_descriptionEsc Key Indicator, detailed_descriptionShows a visual indicator when the esc key is pressed, knobs[], exemplar[esc], update_cadenceNone, identifiercom.iterm2.escindicator) async def reset(session): await asyncio.sleep(2) await session.async_set_variable(user.showEscIndicator, False) async def keystroke_handler(keystroke): if keystroke.keycode ! iterm2.Keycode.ESCAPE: return try: session app.current_terminal_window.current_tab.current_session except: return global counter counter 1 # 值必须每次不同才能触发变量变更通知 await session.async_set_variable(user.showEscIndicator, counter) iterm2.StatusBarRPC async def coro( knobs, show_indicatoriterm2.Reference(user.showEscIndicator?), session_iditerm2.Reference(id)): if show_indicator: if session_id in tasks: tasks[session_id].cancel() del tasks[session_id] task asyncio.create_task(reset(app.get_session_by_id(session_id))) tasks[session_id] task return [ESC] else: return await component.async_register(connection, coro) async with iterm2.KeystrokeMonitor(connection) as mon: while True: keystroke await mon.async_get() await keystroke_handler(keystroke) iterm2.run_forever(main)值得注意的实现细节用户变量user.showEscIndicator是键盘监听器与状态栏组件之间的通信通道键盘监听写入变量StatusBarRPC仅在变量变化时被回调由于 RPC 只在值变化时触发计数必须自增counter 1否则快速连按时可能丢失更新通过tasks[session_id].cancel()实现2 秒后自动熄灭的延迟逻辑并防止上一次的定时任务与新任务竞争变量名带?user.showEscIndicator?使其在未定义时安全返回None这正是该示例最值得复用的防御模式。4.3 点击处理 Popover 网页视图jsonpretty.rst 演示了支持点击的状态栏组件选中终端中的 JSON 文本点击组件即可弹出 600×600 的 popover展示格式化按 key 排序、缩进 4 空格后的结果iterm2.RPC async def onclick(session_id): session app.get_session_by_id(session_id) selection await session.async_get_selection() selectedText await session.async_get_selection_text(selection) await component.async_open_popover(session_id, tohtml(prettyprint(selectedText)), iterm2.util.Size(600, 600)) ... await component.async_register(connection, coro, onclickonclick)这里async_open_popover接受转义后的 HTML 字符串示例中的tohtml负责转义与配合async_get_selection/async_get_selection_text实现了选中即格式化的完整闭环。4.4 变量响应型、定时刷新型与其他组件mousemode.rst通过iterm2.Reference(mouseReportingMode)监听变量mouseReportingMode 0显示空位否则显示 图标演示组件响应变量变化gmtclock.rst把update_cadence设为1秒配合datetime.datetime.now(datetime.timezone.utc).strftime(%H:%M:%S GMT)实现每秒刷新一次的世界时钟diskspace周期性更新自身展示磁盘剩余空间unread带图标与未读计数的组件weather周期性抓取网页并在组件中展示数据同时演示为组件提供图标venv展示当前 Python 虚拟环境名称的状态栏组件。五、Tmux 集成tmux.rst 演示 Tmux 集成 API 的基础用法。前提先通过tmux -CC附加到至少一个 tmux 会话。脚本将向第一个 tmux 会话创建一个含两个标签页的新窗口async def main(connection): tmux_conns await iterm2.async_get_tmux_connections(connection) tmux_conn tmux_conns[0] # 取第一个 tmux 集成连接 window await tmux_conn.async_create_window() # 新建窗口 tab2 await window.async_create_tmux_tab(tmux_conn) # 追加第二个标签页 iterm2.run_until_complete(main)配套的tile示例则演示在 Tmux 集成模式下向 tmux 服务器直接发送命令适合需要精细控制 tmux 布局/窗口的自动化场景。完整的 tmux 集成 API 见 tmux.rst。六、事件监听与变量监控Monitoring for Events 类目下的示例共同展示了 iTerm2 脚本的两大核心能力监听异步事件与监控变量变化。random_color新建会话时触发动作并应用颜色预设Color Presetcolorhost并发监听多种类型事件是学习多事件协调的范例fs-only-status-bar监听窗口的创建与窗口样式变化theme监控变量并应用颜色预设copycolor监听会话创建并应用颜色预设tabtitle监听新标签页创建并演示向用户弹窗请求字符串、改写标签标题async_request_string类交互 APIautoalert监控所有会话中的长时任务并发送系统通知Notification APIstty在所有会话中监听变量变化并回写文本app_tab_color监听当前前台任务foreground job的变化根据当前命令动态调整标签页颜色sync_title监听窗格标题变化并复制到标签标题同时演示变量监控与变量设置async_set_variable。这类脚本的价值在于它们展示了事件 → 回调 → 动作的完整编程模型且大量使用iterm2.Reference(...)绑定系统变量路径配合?后缀保证变量缺失时的健壮性。七、Profile 与颜色预设操作这组示例围绕Profile对象与颜色预设展开覆盖读取、局部修改、全局修改三个层级current_preset获取会话的 Profile 并查询颜色预设列表blending注册一个函数iterm2.RPC用于调整多个 Profile 的取值演示函数注册 APIsettabcolor只修改会话的局部 Profile不更新底层 Profile适合临时改颜色、不改配置的场景increase_font_size改变会话字号而不改动底层 Profileresizeall注册一个函数批量修改窗口中所有会话的字体change_default_profile修改默认 Profilesetprofile修改会话当前使用的 Profile。这组示例揭示了 iTerm2 的 Profile 模型会话级session、局部local、底层underlying三层结构。async_set_profile系列方法允许脚本在不污染持久化配置的前提下临时调整外观也可以反过来持久化修改是配置即代码的重要接口。八、键盘、输入广播与窗口标签管理8.1 键盘钩子function_key_tabsfunction_key_tabs演示改写按键行为通过KeystrokeMonitor监听按键流拦截特定键码后执行自定义动作如切换标签页。它与escindicator中的键盘监听同一套机制区别在于用途是改键而非驱动 UI。8.2 广播输入Broadcast Domainsenable_broadcasting演示**广播域Broadcast Domains**的创建与使用broadcast综合演示分割窗格split panes、广播域、按键过滤、发送输入是学习多窗格协同操作的完整样例。广播域允许把一次击键同时送入多个会话示例展示了从代码侧动态创建/管理广播域、并配合session.async_send_text发送输入的完整链路。8.3 窗口与标签页管理movetab在窗口间移动标签页apply_layout通过iterm2.App.async_apply_layout在标签页、窗口、分割窗格之间搬移会话这是布局编排的底层能力sorttabs重排窗口内标签页顺序mrutabs监听键盘焦点变化始终保持标签页按最近使用MRU排序第一个标签页始终被选中mrutabs2当前标签关闭时自动选中次最近使用的标签页对分割窗格同样生效findps弹窗请求进程 ID然后定位并显示包含该进程的窗格配合进程查询 APItab_group_test演示标签组Tab GroupAPI——创建分组、增删标签、重命名、改色、折叠分组。九、Asyncio、工具栏、右键菜单与选区9.1 Asyncio 并行与定时close_to_the_right演示用asyncio.gather并行执行多个异步动作适合批量操作多个会话/窗口时显著提速darknight演示在一天中的特定时刻执行动作如切换深色主题本质是 asyncio 定时任务 变量/预设的组合。9.2 自定义 Toolbelt 工具targeted_input演示自定义 Toolbelt右侧工具条工具结合广播域与发送输入把定向输入能力封装成可点击的工具栏面板。9.3 自定义右键菜单项sumselection演示自定义上下文菜单项在选中文本上右键即可计算所选中数字之和——通过注册菜单项回调并读取选区文本实现。9.4 选区操作zoom_on_screen演示选中菜单项并修改选区展示了通过菜单 APIMainMenu与选区 APISelection联动的可能性。十、其他高级示例控制序列与函数注册cls注册函数、注入控制序列、遍历会话清屏类操作create_window演示自定义控制序列Custom Control Sequence——应用可以向终端发送自定义 OSC/DCS 序列触发脚本动作ccs进一步演示能识别哪个会话收到了该序列的自定义控制序列是实现终端内快捷键驱动脚本的关键技术相关实现见 customcontrol.rstoneshot注册函数并弹出模态警告框modal alert适合需要用户确认的一次性动作open_browser_tab创建浏览器标签页并加载 URL配合 iTerm2 的浏览器扩展能力。十一、从示例到生产三条可复用的工程经验生命周期选择决定脚本形态持续响应状态栏、键盘监听用run_forever并放入 AutoLaunch一次性任务建窗口、跑命令用run_until_complete需要拉起 App 时第二个参数传True。?后缀是变量引用的安全带所有可能未定义的iterm2.Reference路径都应在末尾加?这是georges_title、escindicator等官方示例中反复出现的模式。用户变量是脚本内部的最佳通信通道user.*命名空间既能让 Shell Integration.bashrc中的iterm2_set_user_var把 shell 数据喂给 Python也能像escindicator那样让脚本内部模块互相协作还能由sync_title用于跨会话状态同步。若想深入某条 API 的完整签名可从 api/library/python/iterm2/docs/index.rst 进入各模块文档如 session.rst、statusbar.rst、tmux.rst再借助各文档中的See Also反向索引定位本目录中演示对应 API 的示例脚本——这正是官方推荐的示例-文档互查学习路径。赞分享桌面应用AI 应用【免费下载链接】iTerm2iTerm2 is a terminal emulator for Mac OS X that does amazing things.项目地址https://gitcode.com/gh_mirrors/it/iTerm2点击查看免费下载相关推荐Gitmux将 Git 状态实时显示在 Tmux 状态栏Gitmux将 Git 状态实时显示在 Tmux 状态栏 项目介绍 Gitmux 是一个开源项目旨在将 Git 仓库的状态实时显示在 Tmux 状态栏中。通Docz 集成 Less 样式预处理器从示例工程到组件文档站点实战Docz 集成 Less 样式预处理器从示例工程到组件文档站点实战 Docz 是一套基于 Gatsby 的组件文档生成工具让团队可以用 Markdown/M文档静态站点开发工具tmuxline.vim优雅生成tmux状态栏的Vim插件指南tmuxline.vim优雅生成tmux状态栏的Vim插件指南 项目概述 tmuxline.vim是一款专为Vim用户设计的插件它能够自动生成美观且功能丰富上一篇Mac Mouse Fix无障碍键盘焦点实现代码实现方法下一篇VueTorrent服务器配置同步保持多实例一致创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进