我经常在编写
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 question和this 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提示我的配置文件调试.