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

BTR*_*BTR 5 bash shell paste tmux

我在编写shell脚本(或其他相关语言)时经常使用REPL风格的编码方法,最近注意到以下问题。我运行 tmux,这样我就可以在 vim 的窗格中与终端提示符并排打开我的脚本。

多路复用器

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

a=hello
b=World
echo $a $b
Run Code Online (Sandbox Code Playgroud)

tmux 无法正确处理换行符,而是给出以下输出:

[user@host: ~]$ a=hello
b='World'
echo $a $b
[user@host: ~]$ b='World'echo $a $b
Run Code Online (Sandbox Code Playgroud)

如果我清除提示并运行echo $a,我会hello在屏幕上回显,但echo $b会生成一个空行,并且显然该echo $a $b行不会运行。

我使用类似 REPL 得到相同的输出gnuplot,或者使用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
Run Code Online (Sandbox Code Playgroud)

我尝试过tmux paste-buffer使用或不使用括号粘贴模式-p标志。

普通 bash shell 或 GNU screen

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

[user@host: ~]$ a=hello
[user@host: ~]$ b=World
[user@host: ~]$ echo $a $b
hello World
[user@host: ~]$
Run Code Online (Sandbox Code Playgroud)

正如预期的那样。在 GNU 屏幕 (v4.04.00) 中粘贴时,我得到相同的输出。

问题

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

已经问过了吗?

在这个 stackoverflow 问题另一个 stackoverflow 问题中似乎也提出了同样的问题,但尚未得到令人满意的回答。

这个答案提供了每个命令之间有一行的解决方案sleep,这确实有技巧,但是假设每个命令在发送下一行文本之前需要多长时间来处理,这有点麻烦。一定会有更好的办法。

版本

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

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

BTR*_*BTR 2

我解决了这个问题。我一直在使用reattach-to-user-namespaceOS X 剪贴板进行交互;然而,根据reattach-to-user-namespace github 页面

注意:在 Yosemite(及更高版本)下,如果没有此存储库中的程序,粘贴板访问似乎可以正常工作。

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

bind -t vi-copy y copy-pipe "pbcopy"
Run Code Online (Sandbox Code Playgroud)

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