当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

我使用 Ubuntu 14.04,我的终端屏幕有一个奇怪的问题,这让我很烦恼。如果我做错了或非 linux-way,有人可以帮助我或解释一下吗?我有某种解决方案,但我想了解为什么这种情况一次又一次发生。

我经常从笔记或互联网上复制 bash 命令,有时我会得到奇怪的 0~ 和 1~ 符号,它们包裹着我复制的东西。这非常烦人,而且这种情况以完全随机的方式发生。

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

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

最佳回答

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

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

bind 'set enable-bracketed-paste off'

然后,如果您喜欢这种行为,您可以将设置放在 ~/.inputrc 中,或 /etc/inputrc 中的 system-wide 中(或 Ubuntu 上的任何位置)。

次佳回答

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

只需键入 vi ~/.bashrc 并在末尾添加 printf "\\e[?2004l" 并使用 :wq 保存文件

第三种回答

为了回答您最初提出的为什么会发生这种情况的问题,这里有一个可能的情况:

  • 我的家用计算机有一个新版本的 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 屏幕,则需要在屏幕外运行 printf 命令。里面好像不起作用。

第四种回答

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

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

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13741.html,未经允许,请勿转载。