【发布时间】:2016-09-22 18:07:26
【问题描述】:
我在编写 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,我会在屏幕上回显hello,但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 question 和 this other stackoverflow question 似乎已提出相同问题,但尚未得到满意答复。
This answer 提供了在每个命令之间添加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) 可以重现相同的结果。
【问题讨论】:
-
你能用完全空的 .tmux.conf 和 .bashrc 文件重现这个吗?您是否正在使用某种可能会发挥作用的剪贴板管理器?这很奇怪,因为我没有遇到这个问题,而且我运行的是相同版本的 OSX、iTerm2 和 tmux。
-
啊,我使用
reattach-to-user-namespace作为包装器来访问 mac os 剪贴板 (this github repo),这似乎是导致问题的原因。复制/粘贴似乎是 vim/tmux/mac os 一直令人头疼的问题,所以我很感激任何解决方案的建议。