我的终端机遇到问题,在我粘贴文本时,该文本以前缀00~和后缀01~。
例如,我将突出显示文本并按下Command-C。然后Command-V,我推入终端,然后看到那些奇怪的字符在文本的开头和结尾处弹出。
例如,我可以突出显示text并将其粘贴到终端中。然后我看到了00~text01~。
文本可以来自任何地方,甚至可以来自终端本身。我没有安装任何复制/粘贴插件,这只是正常的复制/粘贴。我使用的是默认Mac终端,没有任何修改。
我在网上做了一些搜索,显然Paste用特殊字符包裹了文本,以便某些应用程序可以看到这是粘贴的文本并可以正确处理。但是,终端无法正确处理此问题,因此未删除奇怪的字符。显然,此粘贴模式称为“括号内粘贴模式” http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Bracketed-Paste-Mode
我发现了另一个问题,该问题为如何在Linux机器上解决此问题提供了解决方案,但是尝试该解决方案后,我仍然遇到相同的问题。
有人可以告诉我如何禁用终端的方括号粘贴模式吗?还是告诉我消除这些烦人角色的正确方法?
要在终端中禁用括号粘贴模式,请运行以下命令:
printf '\e[?2004l'
Run Code Online (Sandbox Code Playgroud)
这可能并不直接适用于您的问题,但在我看来,这种症状很可能是由我的选择编辑“ mcedit”(午夜指挥官)引起的
为了缓解错误问题,我在.bashrc文件中添加了以下功能:
### vvv 'function mcedit' is a fix-up for the ~0/~1 paste problem
function mcedit() { command mcedit $@ ; printf '\e[?2004l' ; }
然后'source .bashrc'
现在,每次执行“ mcedit”时,当我关闭以重置“托架粘贴模式”时,它将自动添加“ printf“ \ e [?2004l””
为我工作,YMMV。
文本已从某处(可能来自同一终端)进入“系统”(例如 X、MacOS/Aqua)复制缓冲区。此处不修改正文。
文本粘贴到终端;也就是说,“系统”负责确保终端(例如xterm)从复制缓冲区接收未更改的字符序列。终端知道这是粘贴,而不是键盘输入。
终端将缓冲区中的字符序列发送到在前台运行的程序(shell、编辑器等)。对于程序来说,接收到的数据与用户通过键盘输入的数据是无法区分的。
这种透明性(或不透明性?无论如何)通常是一件好事,就像一般的透明管道管道的 Unix 范式一样。但有时,如果程序知道数据是粘贴的,它们可以更好地处理数据。例如,像 vim 这样的编辑器可以关闭自动缩进——毕竟,代码很可能已经缩进了!
输入括号中的 paste。由于主要原因,透明数据管道的范式不能改变;但是数据可以用序列装饰,这些序列通常不会出现在终端输入中以标记其开始和结束。如果终端是这样配置的——对于 xterm,配置将被发送ESC [ ? 2 0 0 4 h——粘贴的数据用转义序列括起来:ESC [ 2 0 0 ~ <buffer contents> ESC [ 2 0 1 ~.
前台程序接收这个“修饰”的数据,由程序来处理它。天真的程序将所有这些都视为用户输入,这就是您所看到的。
在这篇文章中可以找到对括号粘贴的很好的讨论。
您的情况有两个问题:终端意外地以括号粘贴模式结束;并且接收程序——大概是外壳——不处理它。
一种解决方案是 user83536:识别使终端处于该状态的程序,并通过包装器调用它,该包装器在程序结束后再次关闭括号粘贴模式。
该程序可能尝试关闭括号粘贴模式但失败了。原因之一可能是它发送了错误的转义序列。尝试将TERMINAL环境变量设置为最能描述您的终端的值。
尝试关闭有问题的应用程序中的括号粘贴。在 vim 中,有人会说set t_BE=。这可以防止 vim 将终端置于括号粘贴模式,并且当它在会话中设置时,将“结束括号粘贴模式”发送到终端。
拥抱括号糊。这似乎是个好主意。对于使用readline一个的 bash 和其他程序,将把set enable-bracketed-paste on. 对于 vim,可以按照此处的建议进行操作。