在编写shell脚本(或其他相关语言)时,我经常使用REPL样式的编码方法,最近注意到以下问题。我运行tmux所以我可以在一个窗格中将vim打开,并在终端提示符下并排显示。
如果我尝试在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
获得相同的输出。
使用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(而不是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)可以重现相同的结果。
答案 0 :(得分:1)
我解决了这个问题。我一直在使用reattach-to-user-namespace
与OS X剪贴板进行交互;但是,根据reattach-to-user-namespace
github page:
注意:在Yosemite(及更高版本)下,粘贴板访问似乎工作正常 没有来自此存储库的程序。
我从set-option -g default-command "reattach-to-user-namespace -l bash"
文件中删除了.tmux.conf
行。我还将我的tmux映射更改为
bind -t vi-copy y copy-pipe "pbcopy"
并按预期将文本从vi-copy模式复制到OS X剪贴板。使用OS X默认Cmd-v粘贴文本会产生预期的行为(如问题中所述的屏幕或普通bash shell)。感谢@Alex Torok提示我的配置文件调试。