bash – 为什么tmux在粘贴多行命令时不插入换行符?

我经常在编写
shell脚本(或其他相关语言)时使用REPL样式的编码方法,并且最近注意到以下问题.我运行tmux所以我可以在一个窗格中将vim打开,并在终端提示符旁边并排显示.

TMUX

如果我尝试在Mac上使用CMD-v一次粘贴多行命令,即

a=hello
b=World
echo $a $b

tmux不会正确处理换行符,而是提供以下输出:

[user@host: ~]$a=hello
b='World'
echo $a $b
[user@host: ~]$b='World'echo $a $b

如果我清除提示,并运行echo $a,我会向屏幕回调,但echo $b产生一个空行,显然echo $a $b行不会运行.

我使用像gnuplot这样的REPL或使用rlwrap获得相同的输出.

替代tmux尝试

使用vim-slime或手动使用相关的vim-slime系统调用时会出现同样的问题:

[user@host: ~]$tmux set-buffer 'a=hello
> b=World
> echo $a $b
> '
[user@host: ~]$tmux paste-buffer -p
a=hello
b=World
echo $a $b
[user@host: ~]$a=hellob=Worldecho $a $b

我已尝试使用tmux paste-buffer,并且没有bracketed paste mode的-p标志.

普通的bash shell,或GNU屏幕

如果我在普通的bash shell(而不是tmux)中执行相同的CMD-v粘贴操作,我得到:

[user@host: ~]$a=hello
[user@host: ~]$b=World
[user@host: ~]$echo $a $b
hello World
[user@host: ~]$

正如所料.在GNU屏幕(v4.04.00)中粘贴时,我得到相同的输出.

为什么tmux不会像bash / gnu屏幕那样逐行处理粘贴的命令呢?我们如何解决这个问题?

已经问过了吗?

似乎在this stackoverflow questionthis other stackoverflow question也提出了同样的问题,但尚未得到令人满意的答复.

This answer在每个命令之间提供了一个睡眠线的解决方案,它可以解决这个问题,但是在发送下一行文本之前,假设每个命令需要多长时间处理它是一个黑客攻击.肯定有更好的办法.

版本

我正在运行Mac OS X El Capitan(v10.11.6),iTerm2(v3.0.10),tmux(v2.2),GNU bash(v4.4.0).

使用Terminal.app(v2.6)可以重现相同的结果.

最佳答案 我解决了这个问题.我一直在使用reattach-to-user-namespace来与OS X剪贴板进行交互;但是,根据reattach-to-user-namespace
github page

Note: Under Yosemite (and later) pasteboard access seems to work fine
without the program from this repository.

我从.tmux.conf文件中删除了set-option -g default-command“reattach-to-user-namespace -l bash”行.我还将我的tmux映射更改为

bind -t vi-copy y copy-pipe "pbcopy"

并按预期将文本从vi-copy模式复制到OS X剪贴板.使用OS X默认Cmd-v粘贴文本会产生预期的行为(如问题中所述的屏幕或普通bash shell).感谢@Alex Torok提示我的配置文件调试.

点赞