tmux 键绑定到管道窗格内容到程序

ech*_*son 5 tmux

我试图让这个键绑定工作以将当前窗格的内容通过管道传输到我选择的程序:

bind P command-prompt -I "vim -" \
    "capture-pane -eJ -S - -E -; \
    set-buffer -n PIPE; \
    new-window -n '|%1' 'tmux save-buffer -b PIPE - | %1'; \
    delete-buffer -b PIPE"
Run Code Online (Sandbox Code Playgroud)

- 但它总是导致 tmux 报告no buffer PIPE。这段文字通常显示和覆盖的速度太快,我什至都没有注意到;我设法通过使用sleep 10作为命令名称将输出传送到它来引出它。

我选择重命名创建的自动命名缓冲区,capture-pane否则new-window调用似乎会将 tmux 的当前/默认缓冲区重置为我上次在复制模式下复制的缓冲区。据我所知,新缓冲区应该重命名PIPE

我有一个类似但更简单的绑定,它将内容输出到文件而不是管道,完美运行:

bind H command-prompt -I "tmux_#W.txt" \
    "capture-pane -eJ -S - -E -; \
    save-buffer '%%'; \
    delete-buffer"
Run Code Online (Sandbox Code Playgroud)

如果我一一运行其中的命令,程序会像从任何其他管道一样接收窗格的文本。我究竟做错了什么?

小智 2

看起来new-windowdelete-buffer命令之间存在竞争:也就是说,缓冲区“PIPE”在通过管道传输到 vim 或您想要执行的任何程序之前被删除。

下面这个丑陋的黑客在调用之前休眠了一秒钟,delete-buffer为我解决了这个问题:

bind P command-prompt -I "vim -" \
    "capture-pane -eJ -S - -E -; \
    set-buffer -n PIPE; \
    new-window -n '|%1' 'tmux save-buffer -b PIPE - | %1'; \
    run-sh 'sleep 1 && tmux delete-buffer -b PIPE'"
Run Code Online (Sandbox Code Playgroud)