防止在bash中多行粘贴


10

我经常使用ctrl+c鼠标右键单击菜单复制并粘贴某些gui应用程序中的文本,然后将其粘贴到终端仿真器(终止符)中。有时我忘记了剪贴板中包含几行,将其粘贴到bash中会导致每行被“执行”

有一些解决方案可以完全防止多行粘贴吗?


首先将其粘贴到记事本中,以查看所拥有的内容,然后如果可以的话,将其粘贴到您的应用程序中
Skaperen 2015年

1
在bash中运行命令sleep 999999,如果看起来还可以,请粘贴。sleep命令不会读取这些行,并且当您按时这些行将被丢弃ctrl+c
Skaperen



1
@Otheus,printf '\e[?2004h'在大多数类似xterm的终端仿真器中,启用了括号粘贴模式,该模式下终端将粘贴的文本括起来,以便应用程序可以检测粘贴的开始位置和结束位置。xterm还支持另一种模式,\e[?2005h其中所有粘贴的字符都带有前缀^V(许多应用程序和tty行规则都理解为litteral-next)。
斯特凡Chazelas

Answers:


5

该答案不是针对用户问题的最具体答案,请参阅我的第二个答案。我将其保留在这里,因为它解决了更普遍的问题。

按照意见,你原来的职位,你需要(1)终端模拟器,支持括号内的粘贴和(2)无论是在终端上运行,相应的支持即vimbashzsh。支持括号内粘贴的终端仿真器(列表将根据对此文章的评论进行更新):

  • xterm -自??
  • gnome-terminal -自??
  • putty -自0.63(发布日期2013-08-06)

支持括号模式的应用程序:

  • vim
  • zsh

对于bash,StéphaneChazelas整理了一个shell脚本,以方便检测该模式并采取适当的措施。

如果不知道单击粘贴时正在运行的UNIX程序,则无法回答更具体的答案-防止行被切断。

一个剪贴板管理,你也许需要什么。


那里的脚本无法检测到括号内的粘贴,它是一个Perl脚本,它模仿了括号内的粘贴的第三种形式,除了应用程序需要将^ V理解为下一个下一个(应用程序不需要实际回答这个问题,尽管可能需要改进,但这只是一个PoC)。
斯特凡Chazelas

@StéphaneChazelas随时编辑/改善我的帖子。:)“应用程序需要理解^Vliteral-next。但是如何^V进入应用程序的输入流?
Otheus 2015年

如果内部 tty设备未处于icanon模式(例如bashreadline的提示符将看到它(并将其视为原义的下一个字符)),它确实会得到它。如果在icanon模式下,则内部tty设备的线路规则将剥离它(只要lnext字符为^V),就像您手动键入Ctrl-V X一样。
StéphaneChazelas 2015年

1
如果不使用该脚本,则^V除非您使用xterm的quoted paste模式(通过发送启用\e[?2005h),否则不会插入任何内容。这种perl脚本可以得到适应使得它删除所有,但在多线糊的第一行(虽然不是可靠的大膏),但因为它已经是,因为它引用一行readline换行符(就好像你按按Ctrl - V Ctrl-J),可以防止执行这些行(它们只是添加到了编辑缓冲区中,您仍然需要按Enter来执行它们)。
斯特凡Chazelas

4
什么第二答案?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.