我试图让这个键绑定起作用,将当前窗格的内容通过管道传输到我选择的程序:
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-window
和delete-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'"