mcpField
U
using-tmux-for-interactive-commands

using-tmux-for-interactive-commands

github.com/ovachieverAgent 工作流5661 次安装48 周前更新
代码仓库

关于 using-tmux-for-interactive-commands

using-tmux-for-interactive-commands 是通过 tmux 分离会话控制交互式终端程序的技能,介绍如何发送按键并捕获屏幕输出,适用于编辑器、REPL 和交互式 Git 操作。

主要功能

  1. 01启动 tmux 分离会话
  2. 02发送文本和特殊按键
  3. 03捕获终端屏幕输出
  4. 04控制编辑器与 REPL
  5. 05自动执行交互式 Git 命令
  6. 06清理会话

适用场景

  1. 01以编程方式在 vim 中编辑文件
  2. 02在交互式 REPL 中运行命令
  3. 03处理交互式 Git rebase
  4. 04自动化终端应用

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ovachiever/droid-tings --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