我注意到,在 macOS(使用Terminal.app或iTerm2.app)或 Linux(使用urxvt)上粘贴到终端模拟器时,有时我会得到额外的字符。
字符总是相同的 - 在我得到的粘贴文本之前^[[200~
(^[
突出显示)和粘贴的文本之后额外的~
. 如果我取消并再次粘贴,则它已正确粘贴。
例如,在这里我尝试使用 with 将从他们的网页git clone https://git.qemu.org/git/qemu.git
复制的内容粘贴到 iTerm2 中。我取消了并且(没有重新复制)再次粘贴,没关系。⌘vctrlc⌘v
这当然不总是,但一天几次,我没有设法缩小导致它的原因并且无法可靠地重新创建它。
- 文本可以来自任何地方(网站、文本文档、从终端本身复制)。
- 我复制时光标的位置似乎没有什么不同(我不认为我在复制光标)
- 鼠标的位置似乎没有区别。
这些^[[200~
~
字符是什么,我该如何摆脱它们?当然,它们必须代表特定的东西,因为它们总是相同的并且出现在 macOS 和 Linux 上。
这些字符用于括号粘贴模式。一些基于终端的程序启用此模式,以便它们可以区分粘贴的文本和直接键入的文本。
例如,文本编辑器暂时禁用粘贴文本的自动缩进,CLI shell 可能允许您在运行粘贴的命令之前查看/确认它们(即使它们以换行符结尾)。在 zsh 中,所有粘贴的命令都会反向突出显示,并且在您按 Enter 之前不会立即运行。
“括号”遵循“特殊键”转义序列 (
ESC [ <num> ~
) 的通常格式,与 PgUp/PgDn 键或 F4–F12 功能键相同。因此,从您的 shell 或编辑器的角度来看,它们也被视为键绑定。(例如,运行bindkey
应该显示绑定"^[[200~" bracketed-paste
。)有关更多信息,请在zshzle(1)手册中搜索“bracketed-paste”。与所有其他转义序列一样,如果您Ctrl+V在粘贴之前(或在按下特殊键之前)(意外地)按下,它将导致 zsh 将以下序列视为文字输入。例如,Ctrl+V ↑Up不会滚动浏览您的历史记录——它会直接插入
ESC [ A
序列。为避免这种情况,您可以通过 zsh 取消绑定 Ctrl+V 键bindkey
(默认显示为该键"^V" vi-quoted-insert
)。此外,与大多数其他终端仿真模式一样,括号粘贴模式是通过向终端仿真器应用程序发送转义序列来启用的——因此,如果使用它的程序意外死亡,它可能没有任何机会禁用该模式。如果发生这种情况,运行
printf "\e[?2004l"
将暂时停用该模式。(您的终端模拟器完全不知道程序的启动和退出(如果应用程序通过 SSH 远程运行,则更是如此),因此当程序死亡时,它无法自动禁用该模式。例如,如果程序会出现同样的问题启用了“鼠标报告”模式。)
这似乎对我有用(尽管没有意义)
在我的 ubuntu Mate 终端中,我去Edit > Keyboard Shortcuts goto
粘贴- 键已映射到Shift+Ctrl+V
我通过按完全相同的按钮选择并重新输入 - 然后单击关闭- 现在粘贴时不再出现曲线。¯_(ツ)_/¯
这个问题还有另一种表现方式。Readline 的
~/.inputrc
文件可以包含以下内容:上述任何方法都无法解决此问题,并且几个月来一直困扰着我。删除此行或设置
会很好地解决这个问题。
有关此参数和文件的更多信息,请参阅 readline 的手册页,因为您可以使用环境变量
~/.inputrc
更改文件的位置INPUTRC