禁用 Bash 中的默认复制和粘贴行为

禁用 Bash 中的默认复制和粘贴行为

当我粘贴到终端会话中时,shell 会立即执行该命令,而无需我按 Enter 键。

我真的不知道如何禁用这种行为。

我正在使用 MacOS Yosemite 上预装的终端。

答案1

使用bash4.4 或更高版本并且在支持括号粘贴 la 的终端中xterm,您可以执行以下操作:

bind 'set enable-bracketed-paste'

(或添加set enable-bracketed-paste到您的~/.inputrc

这将导致复制粘贴缓冲区在提示符处插入,而不是像键入一样解释其中的字符(如果该缓冲区包含类似 的字符^C^Z并且您的终端模拟器不会将它们过滤掉,您仍然可能会遇到问题) 。

zsh从 5.1 版本开始默认这样做。

对于其他 shell 或终端,另请参阅:我如何保护自己免受这种剪贴板滥用行为的侵害?

答案2

当您粘贴“换行”字符时会发生这种情况。例如,如果您要粘贴多行,或者您无意中在行尾复制了回车符。据我所知,没有办法真正禁用这种行为,但有一些方法可以减轻它。

最简单的方法是一次复制一行并错过最后一个字符,然后手动添加它。

或者,正如 the_velour_fog 下面指出的那样,您也可以将其粘贴到显示非打印字符的编辑器中,然后在没有换行符的情况下重新选择。

对于 GNU/Linux 发行版,有一两个解决方法,但不知道这个概念是否可以移植到 MacOS。不管了,先看看这里看看 mac 中是否有类似的文件可以修改。不幸的是,我对此表示怀疑。

答案3

粘贴之前,输入单引号,然后粘贴。 control-c 和向上箭头将其编辑为一大行。

如果文本包含单引号但不包含双引号,双引号也可以使用。如果它包含或在双引号内扩展的其他内容,这是可以的$,因为您实际上并没有将带引号的巨行作为一个命令运行。


您实际上无法在那里编辑整个内容,因为换行符确实会启动一个连续提示(不是官方术语),而不是制作一大长行。

鉴于这 4 行:

echo
ls
foo
bar

按照我的建议粘贴将导致屏幕上出现以下结果:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]

然后您可以按 Control-C 和向上箭头。 (control-C 会销毁与光标同一行上的所有内容,因此如果那里有有用的文本,请先按回车键。)

另一种方法是关闭报价并按回车键,然后按向上箭头键。

反正,向上箭头后

$ 'echo
ls
foo
bar

control-a 并删除前导'.使用左控制和右控制可在粘贴块中快速移动(通过文字)。或者,如果您的终端设置不支持 control-arrow-keys、alt-b 和 alt-f。


换行符实际上是分隔命令的,这 4 行将分别进入你的命令历史记录。您可能想将它们更改为;&&。 (我不知道这方面的技巧,只需使用按键重复向前或向后单词即可快速到达那里并手动完成。)

答案4

我是不是就公司而言,我是一个非常满意的客户。试试这个终端程序:http://www.emtec.com/zoc/index.html。还有 Mac 版本可用。

如果我违反了此答案的任何 SE 规则,请告诉我,我会删除该答案。

编辑:

当我正确理解其他答案时,这个问题可能是由终端程序引起的。 ZOC终端程序是一款专为工作而完美设计的专业软件。它会粘贴您选择的文本,不带任何其他字符。您可以将会话记录在单独的文本文件中。还有更多

更新:

终端程序有一个选项Paste without final 'newline'。也许这有帮助。

相关内容