将“必需文本”粘贴到终端仿真器中会导致“^[[200~必需文本~”

将“必需文本”粘贴到终端仿真器中会导致“^[[200~必需文本~”

我注意到,在 macOS 上粘贴到终端仿真器时(使用终端应用程序或者iTerm2.app)或在 Linux 中(使用乌尔希)有时我会得到额外的字符。

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

例如,我尝试粘贴git clone https://git.qemu.org/git/qemu.git他们的网页使用 进入 iTerm2 v。我使用 取消ctrlc并(没有重新复制)再次使用 粘贴,v这样就好了。

截屏

这种情况当然不是总是发生,但每天会发生几次,我无法缩小导致这种情况的原因范围,也无法可靠地重现它。

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

这些^[[200~ ~字符是什么?我该如何去掉它们?它们肯定代表着某种特定的东西,因为它们总是相同的,并且出现在 macOS 和 Linux 上。

答案1

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

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

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

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

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

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

答案2

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

set enable-bracketed-paste On

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

set enable-bracketed-paste Off

将会很好地解决这个问题。

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

答案3

这似乎对我有用(尽管没有意义)

在我的 Ubuntu Mate 终端中编辑 > 键盘快捷键

粘贴- 按键已映射到Shift+Ctrl+V

我选择并重新输入,按完全相同的按钮 - 然后点击关闭- 现在粘贴时不再出现波浪线。¯_(ツ)_/¯

答案4

Windows 下的另一个解决方案是打开一个新终端。我无法使用可接受的解决方案“printf "\e[?2004l"”退出括号粘贴模式。

相关内容