关于 using-tmux-for-interactive-commands
指导 Agent 使用 tmux 自动控制需要终端交互的命令行程序。它提供创建会话、发送按键、捕获屏幕和清理会话的操作流程,适用于编辑器、REPL 和交互式 Git 命令。
主要功能
- 01创建分离式 tmux 会话
- 02发送文本与特殊按键
- 03捕获终端屏幕输出
- 04指定会话工作目录
- 05结束并清理会话
适用场景
- 01通过命令行编辑器修改文件
- 02自动操作交互式 Git rebase
- 03控制 Python 或 Node REPL
- 04运行需要终端交互的全屏程序
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ obra/ superpowers-lab --skill using-tmux-for-interactive-commands安装后在 Claude Code 中输入/using-tmux-for-interactive-commands确认已加载。
附带文件tmux-wrapper.sh
详细介绍
使用 tmux 运行交互式命令
概述
交互式 CLI 工具(vim、交互式 git rebase、REPL 等)无法通过标准 bash 控制,因为它们需要真实终端。tmux 提供可通过 send-keys 和 capture-pane 以编程方式控制的分离会话。
适用场景
以下情况请使用 tmux:
- 以编程方式运行 vim、nano 或其他文本编辑器
- 控制交互式 REPL(Python、Node 等)
- 处理交互式 git 命令(
git rebase -i、git add -p) - 使用全屏终端应用(htop 等)
- 执行需要终端控制码或 readline 的命令
以下情况请勿使用:
- 简单的非交互式命令(使用常规 Bash 工具)
- 通过 stdin 重定向接收输入的命令
- 不需要交互的一次性命令
快速参考
| 任务 | 命令 |
|---|---|
| 启动会话 | tmux new-session -d -s <name> <command> |
| 发送输入 | tmux send-keys -t <name> 'text' Enter |
| 捕获输出 | tmux capture-pane -t <name> -p |
| 停止会话 | tmux kill-session -t <name> |
| 列出会话 | tmux list-sessions |
核心模式
之前(无法运行)
# This hangs because vim expects interactive terminal
bash -c "vim file.txt"
之后(可以运行)
# Create detached tmux session
tmux new-session -d -s edit_session vim file.txt
# Send commands (Enter, Escape are tmux key names)
tmux send-keys -t edit_session 'i' 'Hello World' Escape ':wq' Enter
# Capture what's on screen
tmux capture-pane -t edit_session -p
# Clean up
tmux kill-session -t edit_session
实现
基本工作流
- 创建分离会话,并运行交互式命令
- 稍作等待,让程序完成初始化(视命令而定,等待 100-500ms)
- 使用
send-keys发送输入(可以发送 Enter、Escape 等特殊按键) - 使用
capture-pane -p捕获输出,查看当前屏幕状态 - 根据需要重复步骤 3-4
- 完成后终止会话
特殊按键
常见的 tmux 按键名称:
Enter- 回车/换行Escape- ESC 键C-c- Ctrl+CC-x- Ctrl+XUp、Down、Left、Right- 方向键Space- 空格键BSpace- 退格键
工作目录
创建会话时指定工作目录:
tmux new-session -d -s git_session -c /path/to/repo git rebase -i HEAD~3
辅助包装脚本
如需更方便地使用,请参阅 /home/jesse/git/interactive-command/tmux-wrapper.sh:
# Start session
/path/to/tmux-wrapper.sh start <session-name> <command> [args...]
# Send input
/path/to/tmux-wrapper.sh send <session-name> 'text' Enter
# Capture current state
/path/to/tmux-wrapper.sh capture <session-name>
# Stop
/path/to/tmux-wrapper.sh stop <session-name>
常见模式
Python REPL
tmux new-session -d -s python python3 -i
tmux send-keys -t python 'import math' Enter
tmux send-keys -t python 'print(math.pi)' Enter
tmux capture-pane -t python -p # See output
tmux kill-session -t python
Vim 编辑
tmux new-session -d -s vim vim /tmp/file.txt
sleep 0.3 # Wait for vim to start
tmux send-keys -t vim 'i' 'New content' Escape ':wq' Enter
# File is now saved
交互式 Git Rebase
tmux new-session -d -s rebase -c /repo/path git rebase -i HEAD~3
sleep 0.5
tmux capture-pane -t rebase -p # See rebase editor
# Send commands to modify rebase instructions
tmux send-keys -t rebase 'Down' 'Home' 'squash' Escape
tmux send-keys -t rebase ':wq' Enter
常见错误
会话启动后未等待
问题:new-session 后立即捕获会显示空白屏幕
**修复:**首次捕获前稍作等待(100-500ms)
tmux new-session -d -s sess command
sleep 0.3 # Let command initialize
tmux capture-pane -t sess -p
忘记按 Enter 键
**问题:**输入了命令,但命令并未执行
**修复:**显式发送 Enter
tmux send-keys -t sess 'print("hello")' Enter # Note: Enter is separate argument
使用了错误的按键名称
问题:tmux send-keys -t sess '\n' 不起作用
**修复:**使用 tmux 按键名称:Enter,而不是 \n
tmux send-keys -t sess 'text' Enter # ✓
tmux send-keys -t sess 'text\n' # ✗
未清理会话
**问题:**tmux 孤立会话不断累积
**修复:**完成后务必终止会话
tmux kill-session -t session_name
# Or check for existing: tmux has-session -t name 2>/dev/null
实际效果
- 支持以编程方式控制 vim/nano 来编辑文件
- 可自动化交互式 git 工作流(rebase、add -p)
- 让基于 REPL 的测试/调试成为可能
- 解除任何需要终端交互的工具的使用限制
- 无需构建自定义 PTY 管理机制——tmux 会处理所有工作
评论
支持 Markdown