将 'required text' 粘贴到终端模拟器会导致 '^[[200~required text~'

lx0*_*x07 5 urxvt arch-linux copy-paste iterm2 macos-catalina

我注意到,在 macOS(使用Terminal.appiTerm2.app)或 Linux(使用urxvt)上粘贴到终端模拟器时,有时我会得到额外的字符。

字符总是相同的 - 在我得到的粘贴文本之前^[[200~^[突出显示)和粘贴文本之后一个额外的~. 如果我取消并再次粘贴,则会正确粘贴。

例如,下面我试图粘贴git clone https://git.qemu.org/git/qemu.git从复制他们的网页到iTerm2用?v。我取消了ctrlc并且(没有重新复制)再次粘贴了,?v没关系。

截屏

这当然并非总是如此,而是一天几次,我还没有设法缩小导致它的原因并且无法可靠地重新创建它。

  • 文本可以来自任何地方(网站、文本文档、从终端本身复制)。
  • 复制时光标的位置似乎没有区别(我认为我不是在复制光标)
  • 鼠标的位置似乎没有什么区别。

这些^[[200~ ~字符是什么,我该如何摆脱它们?当然,它们必须代表特定的东西,因为它们总是相同的,并且出现在 macOS 和 Linux 上。

use*_*686 10

这些字符用于括号粘贴模式。一些基于终端的程序启用此模式,以便它们可以区分粘贴的文本和直接键入的文本。

例如,文本编辑器暂时禁用粘贴文本的自动缩进,并且 CLI shell 可能允许您在运行之前查看/确认粘贴的命令(即使它们以换行符结尾)。在 zsh 中,所有粘贴的命令都会反向突出显示,并且在您按 Enter 之前不会立即运行。

“括号”遵循“特殊键”转义序列 ( ESC [ <num> ~)的通常格式,与 PgUp/PgDn 键或 F4–F12 功能键相同。因此,从您的 shell 或编辑器的角度来看,它们也被视为键绑定。(例如,运行bindkey应该显示绑定"^[[200~" bracketed-paste。)有关更多信息,请在zshzle(1)手册中搜索“ bracketed -paste” 。

与所有其他转义序列一样,如果您(不小心)Ctrl+V在粘贴之前(或在按下特殊键之前)按下,它将导致 zsh 将以下序列视为文字 input。例如,Ctrl+V ?Up不会滚动浏览您的历史记录 - 它会直接插入ESC [ A序列。为避免这种情况,您可以通过 zsh 解除 Ctrl+V 键的绑定bindkey"^V" vi-quoted-insert默认情况下显示为该键)。

此外,与大多数其他终端仿真模式一样,括号粘贴模式是通过向终端仿真器应用程序发送转义序列来启用的——因此,如果使用它的程序意外终止,它可能没有机会禁用该模式。如果发生这种情况,运行printf "\e[?2004l"将暂时停用该模式。

(您的终端模拟器完全不知道程序的启动和退出(如果应用程序通过 SSH 远程运行,则更是如此),因此当程序终止时,它无法自动禁用该模式。如果例如程序,则会出现同样的问题启用了“鼠标报告”模式。)


Dan*_*anG 9

此问题还有另一种表现形式。Readline 的~/.inputrc文件可以包含以下内容:

set enable-bracketed-paste On
Run Code Online (Sandbox Code Playgroud)

上述任何方法都无法解决这个问题,并且已经困扰了我几个月。删除此行或设置

set enable-bracketed-paste Off
Run Code Online (Sandbox Code Playgroud)

会很好地解决这个问题。

有关此参数和文件的更多信息,请参阅 readline 的手册页,因为您可以使用环境变量~/.inputrc更改文件的位置INPUTRC

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (2认同)