mcpField
U
using-tmux-for-interactive-commands

using-tmux-for-interactive-commands

github.com/obraAgent 工作流434505 次安装21 周前更新
代码仓库

关于 using-tmux-for-interactive-commands

指导 Agent 使用 tmux 自动控制需要终端交互的命令行程序。它提供创建会话、发送按键、捕获屏幕和清理会话的操作流程,适用于编辑器、REPL 和交互式 Git 命令。

主要功能

  1. 01创建分离式 tmux 会话
  2. 02发送文本与特殊按键
  3. 03捕获终端屏幕输出
  4. 04指定会话工作目录
  5. 05结束并清理会话

适用场景

  1. 01通过命令行编辑器修改文件
  2. 02自动操作交互式 Git rebase
  3. 03控制 Python 或 Node REPL
  4. 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

实现

基本工作流
  1. 创建分离会话,并运行交互式命令
  2. 稍作等待,让程序完成初始化(视命令而定,等待 100-500ms)
  3. 使用 send-keys 发送输入(可以发送 Enter、Escape 等特殊按键)
  4. 使用 capture-pane -p 捕获输出,查看当前屏幕状态
  5. 根据需要重复步骤 3-4
  6. 完成后终止会话
特殊按键

常见的 tmux 按键名称:

  • Enter - 回车/换行
  • Escape - ESC 键
  • C-c - Ctrl+C
  • C-x - Ctrl+X
  • Up、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