Answers:
tl; dr
... | tmux loadb -
tmux saveb - | ...
说明与背景
在tmux中,所有复制/粘贴活动都会通过缓冲区堆栈,其中顶部(索引0)是最近复制的文本,当未显式提供缓冲区索引时将用于粘贴-b
。您可以使用tmux list-buffers
或默认快捷键tmux-prefix+ 检查当前缓冲区#。
有两种方法可以传递到堆栈顶部的新tmux缓冲区中:set-buffer
采用字符串参数和load-buffer
采用文件参数。要通过管道传输到缓冲区,通常需要load-buffer
与stdin 一起使用,例如:
print -l **/* | tmux loadb -
将其粘贴回编辑器中是很明显的(tmux-prefix+ ]或您绑定paste-buffer
的对象),但是,不是从外壳内部访问粘贴的,因为调用paste-buffer
会将粘贴写入stdin,最终在终端的编辑中缓冲区,粘贴中的任何换行符都会使Shell执行到目前为止粘贴的内容(这可能是毁掉您一天的好方法)。
有两种方法可以解决此问题:
tmux pasteb -s ' '
:-s
用您提供的任何分隔符替换所有行尾(分隔符)。但是,您仍然会遇到这种情况,paste-buffer
这意味着粘贴最终会出现在终端编辑缓冲区中,这可能是您想要的,但通常不是。tmux showb | ...
:show-buffer
将缓冲区打印到stdout,几乎是必需的,但是正如Chris Johnsen在评论中提到的那样,show-buffer
对不可打印的ASCII字符和非ASCII字符执行八进制编码。不幸的是,这种中断通常足以使人烦恼,甚至是简单的事情,例如以null结尾的字符串或带重音的拉丁字符(例如(在zsh中)print -N á | tmux loadb - ; tmux showb
打印\303\241\000
)。tmux saveb - | ...
:save-buffer
只是做相反的操作,load-buffer
并将未修改的原始字节写入stdin,这在大多数情况下是需要的。然后,您可以继续组装另一个管道,例如。传递| xargs -n1 -I{} ...
到流程生产线等。
tmux show-buffer
将对C0控制字符和非ASCII字节(例如重音拉丁字符等)进行八进制编码。您可以使用tmux save-buffer -
是否需要原始字节(通常这是您想要的)。