tmux 键绑定到管道窗格内容以进行编程

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"

- 但它总是会导致 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"

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

答案1

看起来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'"

相关内容