无论我使用 ctrl+shift+v 还是从右键单击菜单粘贴,都会发生这种情况。
可以采取什么措施来防止这种行为?
答案1
不要复制多行文本进行粘贴。我几乎可以保证您只是复制了该行的最后一部分。如果您三次单击以复制要粘贴的该行代码,则会在该行末尾看到换行符。如果您想确定这确实是问题所在,请复制整行(最后一个字母/数字除外),然后查看粘贴时是否还包含换行符。
答案2
您粘贴的文本包含尾随换行符。当您粘贴换行符时,终端中运行的 shell 会将其视为按下Enter,因此它会执行该命令。
粘贴操作由终端仿真器执行;它将粘贴的文本传递到终端中运行的应用程序,就像传递用户键入的文本一样。看键盘输入和文本输出如何工作?有关输入如何工作的更多信息。应用程序(此处为 shell)无法区分击键和粘贴操作。
现在许多终端模拟器都支持括号内的粘贴。在括号粘贴模式下,应用程序能区分粘贴操作和击键。仅当应用程序对粘贴的文本执行不同的操作时,括号内的粘贴才有用,因此它是通过支持应用程序启用的,而不是由终端仿真器的用户配置的。
Zsh 5.1(几周前发布,因此在大多数发行版中尚不可用)添加了对括号粘贴模式的支持。当您粘贴文本时,它只是插入到命令行中,您可以在按Enter执行命令行之前对其进行编辑。
oh-my-zsh 的用户可以使用安全粘贴插件即使在 zsh 的早期版本中也是如此。
您可以在 zsh 中做的另一件事是使其将选择作为字符串插入,并用引号引起来(以每个 shell 特殊字符(例如空格)之前的反斜杠的形式)。键入`xsel`
以获取主要选择(自动鼠标选择),或`xsel -b`
获取剪贴板内容(使用Ctrl+复制的文本C),然后按Tab。
如果您有较旧的 zsh 版本并且想要插入剪贴板内容而不加引号,则可以定义一个插入所选内容的函数。
function zle_insert_x_selection {
LBUFFER+=$(xsel ${NUMERIC+-b} -o </dev/null)
}
zle -N zle_insert_x_selection
bindkey '\e\C-v' zle_insert_x_selection
在您的 中.zshrc
,您可以按Ctrl+ Alt+V插入主要选择,或按Ctrl+ U Ctrl+ Alt+V插入剪贴板内容。它们被插入到光标之前,除了没有尾随换行符之外,保持不变。看在 bash 和 X11 之间共享剪贴板对于 bash 中类似的东西。
答案3
如果您使用 bash 作为 shell,则可以按Ctrl-X Ctrl-E
调出编辑器(由 $VISUAL 或 $EDITOR 定义,例如vi
或可能nano
)。
然后,您可以将命令粘贴到其中,就像编辑文件一样。如果您保存并退出,它们将被执行。或者如果您退出而未保存则取消。
答案4
在文本编辑器窗口中,使用以下快捷方式复制不带 \n(换行符)的文本:
- Shift+ Home, Ctrl+ Insert– 复制光标之前的行的一部分。
- Shift+ End, Ctrl+ Insert– 复制光标后的部分行。
- Home, Shift+ End, Ctrl+ Insert– 复制所有不带 \n 的行。
在浏览器窗口或文本不可编辑的其他内容中,使用以下两种技术之一:
- 首先复制到文本编辑器(首选,因为这样您就有机会编辑命令)。
- 仅选择该行上的文本(不将选择区域向右延伸到最后一个字符之外),然后Ctrl+Insert并粘贴到终端窗口。
正确的选择(没有 \n)看起来如何:
ls -al
错误的选择(带有 \n)看起来如何:
ls -al