为什么 tmux 在粘贴多行命令时不插入换行符?
Why does tmux not insert newlines when pasting a multi-line command?
我在编写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 screen 那样逐行处理粘贴的命令?我们如何解决这个问题?
已经问过了吗?
this Whosebug question, and this other Whosebug question 似乎也提出了同样的问题,但尚未得到令人满意的回答。
This answer 提供了一个 sleep
行在每个命令之间的解决方案,它可以解决问题,但是假设每个命令在发送之前需要处理多长时间有点hack下一行文字。一定有更好的办法。
版本
我是运行ning 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 复制模式将文本复制到 OS X 剪贴板。使用 OS X 默认 Cmd-v 粘贴文本会产生预期的行为(如问题中所述的屏幕或普通 bash shell)。感谢@Alex Torok 提示我调试配置文件。
我在编写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 screen 那样逐行处理粘贴的命令?我们如何解决这个问题?
已经问过了吗?
this Whosebug question, and this other Whosebug question 似乎也提出了同样的问题,但尚未得到令人满意的回答。
This answer 提供了一个 sleep
行在每个命令之间的解决方案,它可以解决问题,但是假设每个命令在发送之前需要处理多长时间有点hack下一行文字。一定有更好的办法。
版本
我是运行ning 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 复制模式将文本复制到 OS X 剪贴板。使用 OS X 默认 Cmd-v 粘贴文本会产生预期的行为(如问题中所述的屏幕或普通 bash shell)。感谢@Alex Torok 提示我调试配置文件。