为什么我的终端屏幕偶尔会启用括号粘贴模式?

为什么我的终端屏幕偶尔会启用括号粘贴模式?

我使用 Ubuntu 14.04,我的终端屏幕出现了一个奇怪的问题,让我很烦。有人能帮我解决这个问题吗?或者告诉我我是不是做错了什么,或者不是 Linux 的方式?我有某种解决方案,但我想知道为什么这种情况一再发生。

我经常从笔记或互联网上复制 bash 命令,有时会出现奇怪的 0~ 和 1~ 符号,这些符号会将我复制的内容括起来。这非常烦人,而且这种情况完全是随机发生的。

经过长时间的搜索,我发现这个东西叫做括号粘贴模式所以现在printf "\e[?2004l"如果此模式突然启用,我会使用此命令来修复我的终端。

是否有可能以某种方式永久禁用此功能?我现在使用的所有 Ubuntu 机器都遇到了这个问题。以前我使用过 Ubuntu 10.10 和 12.04,从未遇到过这样的问题。

答案1

您可以禁用括号粘贴模式。

若要暂时尝试一下,请在 bash 中:

bind 'set enable-bracketed-paste off'

然后,如果您喜欢这种行为,您可以将设置放在您的~/.inputrc、或系统范围内/etc/inputrc(或 Ubuntu 上的任何位置)。

答案2

您可以将该命令放入您的bashrc。然后它将在您每次打开终端时应用。

只需在末尾输入vi ~/.bashrc并添加printf "\e[?2004l",然后使用以下代码保存文件:wq

答案3

回答你最初的问题为什么发生这种情况时,可能出现以下情况:

  • 我家里的电脑有新版本的 zsh,支持括号粘贴(我们称之为 shell A)
  • 我使用 ssh 连接到计算机,并将 shell 设置为旧版本的 bash,不支持括号粘贴(shell B)

问题是,当从 shell A 切换到 shell B 时,我的终端程序仍然认为括号粘贴已启用,因此它会不断在粘贴的内容周围添加字符(0~ 和 1~ 位)。Shell B 不支持它们,因此它只是将它们原封不动地传递过去。您必须通过让 shell 打印一个特殊的转义序列来告诉终端关闭括号粘贴 - 这就是它的作用printf "\e[?2004l"

有几种方法可以解决这个问题:

  1. 如果你根本不关心括号粘贴,请在 shell A 上将其关闭,这样它就不会首先启用(@jwd 的答案)

  2. 如果您想继续在 shell A 上使用括号粘贴,但在 shell B 上禁用,请将转义序列添加到您的.bashrc(@MOHRE 的答案)

  3. 升级 shell B 以支持括号粘贴,以便它正确解释那些 0~ 和 1~ 字符。

附注:如果您使用的是 GNU screen,则需要printf在 screen 外运行该命令。在 screen 内似乎不起作用。

答案4

我通过将以下内容添加到我的 ~/.bashrc 文件来解决了这个问题:

if [[ $- == *i* ]]; then
    bind 'set enable-bracketed-paste off'
fi

这样,当我执行 bash 脚本时就不会收到绑定警告。

相关内容