结论:iTerm2 支持扩展插件(基于其官方 Python API)。但针对你需要“外挂输入框”的具体需求,iTerm2 已经原生内置了此功能,称为 Composer(命令编写器) 。
从需求分析到代码实现,以下是基于第一性原理的详细拆解:
一、 需求简化:使用原生内置功能 (Composer)
在考虑开发插件之前,最简化的方案是复用现有架构。你需要外挂输入框的核心目的通常是:安全地编写多行命令,避免在终端内误触回车导致提前执行。
- 事实:iTerm2 提供了 Composer 功能。
- 调用方式:在 iTerm2 窗口中按下快捷键
Shift + Cmd + .(或在菜单栏选择View->Composer)。 - 功能表现:底部或悬浮弹出一个独立的文本输入框。你可以在其中随意编辑、换行,确认无误后按
Enter键,内容会被发送到当前终端并执行。
二、 架构设计:如果必须自己开发插件
如果内置的 Composer 无法满足你的定制化需求(例如:你需要输入框附带特定的快捷命令按钮,或与你其他的本地自动化工作流联动),你可以基于 iTerm2 的架构进行扩展。
1. 底层通信逻辑
iTerm2 的插件机制并非传统的动态链接库注入,而是提供了一个基于 Python asyncio 和 WebSockets 的 API 守护进程通信模型。
- 事实:你的 Python 脚本作为一个独立的进程运行,通过 WebSocket 监听 iTerm2 的事件并发送指令。
2. 核心代码实现路径
要实现一个自定义的外挂输入框,需要以下几个模块的交互:
-
环境准备:在 iTerm2 中通过
Scripts->Manage->New Python Script创建一个长期运行的 Daemon(守护进程)脚本。 -
UI 渲染:iTerm2 的 Python API 允许你在右侧的 Toolbelt(工具栏)中创建自定义的 HTML/Webview 界面。你可以编写一个简单的 HTML 输入框。
-
事件触发与数据注入:
当用户在 Webview 输入框中点击“发送”时,Python 脚本接收到事件,并调用 iTerm2 API 将文本注入到当前的 Session 中。
概念验证代码思路:
Python
import iterm2
async def main(connection):
app = await iterm2.async_get_app(connection)
# 假设你从你的自定义 UI (如 Toolbelt 或外部 GUI) 获取到了输入文本
custom_input_text = "echo 'Hello from external box!'"
# 获取当前活动窗口和会话
window = app.current_terminal_window
if window is not None:
session = window.current_tab.current_session
# 将文本发送到终端
await session.async_send_text(custom_input_text + "\n")
iterm2.run_until_complete(main)
推测与限制:
iTerm2 原生 API 对于直接在终端主界面上方绘制“任意悬浮窗”的支持较弱。若要实现纯粹的悬浮外挂窗口,推测需要结合 Python 的 PyObjC 库直接调用 macOS 的原生 Cocoa API 来绘制顶层窗口,然后再通过 iTerm2 Python API 将文本传回终端。