item2 支持任意悬浮框

3 阅读2分钟

结论: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 将文本传回终端。