name: tmux description: “通过发送按键和捕获输出,远程控制tmux会话以用于交互式CLI(如Python、gdb等)。” license: Vibecoded
tmux 技能
将tmux用作可编程终端复用器进行交互式工作。适用于Linux和macOS的标准tmux;通过使用私有套接字避免自定义配置。
快速开始(隔离套接字)
SOCKET_DIR=${TMPDIR:-/tmp}/claude-tmux-sockets # 所有代理套接字的知名目录
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/claude.sock" # 将代理会话与您的个人tmux分开
SESSION=claude-python # 类似缩写的名称;避免空格
tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- 'python3 -q' Enter
tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200 # 监视输出
tmux -S "$SOCKET" kill-session -t "$SESSION" # 清理
启动会话后,务必告诉用户如何监视会话,提供一个可复制粘贴的命令:
要自己监视此会话:
tmux -S "$SOCKET" attach -t claude-lldb
或一次性捕获输出:
tmux -S "$SOCKET" capture-pane -p -J -t claude-lldb:0.0 -S -200
这必须在会话启动后立即打印,并在工具循环结束时再次打印。但越早发送,用户越满意。
套接字约定
- 代理必须将tmux套接字放在
CLAUDE_TMUX_SOCKET_DIR下(默认为${TMPDIR:-/tmp}/claude-tmux-sockets),并使用tmux -S "$SOCKET"以便我们可以枚举/清理它们。首先创建目录:mkdir -p "$CLAUDE_TMUX_SOCKET_DIR"。 - 除非必须进一步隔离,否则使用的默认套接字路径:
SOCKET="$CLAUDE_TMUX_SOCKET_DIR/claude.sock"。
目标窗格和命名
- 目标格式:
{session}:{window}.{pane},如果省略则默认为:0.0。保持名称简短(例如,claude-py、claude-gdb)。 - 始终使用
-S "$SOCKET"以保持在私有套接字路径上。如果需要用户配置,请省略-f /dev/null;否则-f /dev/null提供干净配置。 - 检查:
tmux -S "$SOCKET" list-sessions,tmux -S "$SOCKET" list-panes -a。
查找会话
- 在活动套接字上列出带有元数据的会话:
./scripts/find-sessions.sh -S "$SOCKET";添加-q partial-name以过滤。 - 扫描共享目录下的所有套接字:
./scripts/find-sessions.sh --all(使用CLAUDE_TMUX_SOCKET_DIR或${TMPDIR:-/tmp}/claude-tmux-sockets)。
安全发送输入
- 优先使用字面量发送以避免shell分割:
tmux -L "$SOCKET" send-keys -t target -l -- "$cmd" - 在组合内联命令时,使用单引号或ANSI C引用以避免扩展:
tmux ... send-keys -t target -- $'python3 -m http.server 8000'。 - 发送控制键:
tmux ... send-keys -t target C-c,C-d,C-z,Escape等。
监视输出
- 捕获最近历史(连接行以避免换行伪影):
tmux -L "$SOCKET" capture-pane -p -J -t target -S -200。 - 对于连续监视,使用辅助脚本(如下)轮询,而不是
tmux wait-for(它不监视窗格输出)。 - 您也可以临时附加以观察:
tmux -L "$SOCKET" attach -t "$SESSION";使用Ctrl+b d分离。 - 当向用户提供指令时,明确打印一个可复制/粘贴的监视命令,不要假设他们记得命令。
生成进程
进程的一些特殊规则:
- 当要求调试时,默认使用lldb
- 启动Python交互式shell时,始终设置
PYTHON_BASIC_REPL=1环境变量。这非常重要,因为非基本控制台会干扰您的send-keys。
同步/等待提示
- 使用定时轮询以避免与交互式工具的竞争。示例:在发送代码前等待Python提示:
./scripts/wait-for-text.sh -t "$SESSION":0.0 -p '^>>>' -T 15 -l 4000 - 对于长时间运行的命令,轮询完成文本(如
"Type quit to exit","Program exited"等)后再继续。
交互式工具食谱
- Python REPL:
tmux ... send-keys -- 'python3 -q' Enter;等待^>>>;使用-l发送代码;用C-c中断。始终使用PYTHON_BASIC_REPL。 - gdb:
tmux ... send-keys -- 'gdb --quiet ./a.out' Enter;禁用分页tmux ... send-keys -- 'set pagination off' Enter;用C-c中断;发出bt,info locals等;通过quit退出然后确认y。 - 其他TTY应用程序(ipdb,psql,mysql,node,bash):相同模式——启动程序,轮询其提示,然后发送字面文本和Enter。
清理
- 完成后终止会话:
tmux -S "$SOCKET" kill-session -t "$SESSION"。 - 终止套接字上的所有会话:
tmux -S "$SOCKET" list-sessions -F '#{session_name}' | xargs -r -n1 tmux -S "$SOCKET" kill-session -t。 - 移除私有套接字上的所有内容:
tmux -S "$SOCKET" kill-server。
辅助:wait-for-text.sh
./scripts/wait-for-text.sh轮询窗格以匹配正则表达式(或固定字符串),具有超时。适用于带有bash + tmux + grep的Linux/macOS。
./scripts/wait-for-text.sh -t session:0.0 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]
-t/--target窗格目标(必需)-p/--pattern匹配的正则表达式(必需);添加-F表示固定字符串-T超时秒数(整数,默认15)-i轮询间隔秒数(默认0.5)-l从窗格搜索的历史行数(整数,默认1000)- 第一次匹配时退出0,超时退出1。失败时打印最后捕获的文本到stderr以帮助调试。