我的终端遇到了一个问题,当我粘贴文本时,它的前缀是00~
,后缀是01~
。
例如,我将突出显示文本并推送Command-C
。然后我将Command-V
推送到终端中,我看到那些奇怪的字符在文本的开头和结尾处弹出。
例如,我可以突出显示text
并将其粘贴到终端中。然后我会看到00~text01~
。
文本可以来自任何地方,甚至来自终端本身。我没有安装任何复制/粘贴插件,这只是正常的复制/粘贴。我使用的是默认的Mac终端,没有任何修改。
我在网上做了一些搜索,显然Paste将文本 Package 在特殊字符中,以便某些应用程序可以看到这是粘贴的文本并正确处理它。然而,终端无法正确处理这一点,因此无法删除奇怪的字符。显然这种粘贴模式称为“括号粘贴模式”http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Bracketed-Paste-Mode
我发现了另一个问题,它给出了如何在Linux机器上解决这个问题的解决方案,但在尝试了那个解决方案之后,我仍然有同样的问题。
有人能告诉我如何禁用终端的括号粘贴模式吗?或者告诉我如何摆脱这些烦人的字符?
5条答案
按热度按时间7qhs6swi1#
粘贴文本会发生什么
1.文本已经从某个地方进入“系统”(例如X,MacOS/Aqua)复制缓冲区,可能来自同一个终端。文本在这里没有改变。
1.将文本粘贴到终端;也就是说,“系统”负责终端(例如
xterm
)从复制缓冲区接收未改变的字符序列。终端知道这是粘贴,而不是键盘输入。1.终端将缓冲区中的字符序列发送给运行在前台的程序(shell、编辑器等)。对于程序来说,接收到的数据与用户通过键盘输入的数据是无法区分的。
讨论
这种透明性(或者说不透明性?不管怎样)通常是一件好事,就像Unix中的透明管道系统一样。但是有时候,如果程序知道数据是粘贴的,他们可以更好地处理数据。例如,像vim这样的编辑器可以关闭自动缩进-毕竟,代码可能已经缩进了!
括号粘贴
输入 * 括号粘贴 *。由于主要原因,透明数据管道的范例不能改变;但是数据可以用序列来修饰,这些序列通常不会出现在终端输入中来标记它的开始和结束。如果终端是这样配置的-对于xterm,配置将是发送
ESC [ ? 2 0 0 4 h
-粘贴的数据用转义序列括起来:ESC [ 2 0 0 ~ <buffer contents> ESC [ 2 0 1 ~
。前台程序接收这些“修饰”的数据,然后由程序来处理它。一个简单的程序将所有这些都视为用户输入,这就是您所看到的。
在this article中可以找到对括号内粘贴的很好的讨论。
补救措施
您的案例中有两个问题:终端意外地以括号粘贴模式结束;并且接收程序--大概是shell --不处理它。
TERMINAL
环境变量设置为最能描述您的终端的值。set t_BE=
。这可以防止vim将终端置于括号粘贴模式,并且当它在会话中设置时,会向终端发送“结束括号粘贴模式”。readline
的程序,可以使用set enable-bracketed-paste on
。对于vim,可以遵循建议here.k7fdbhmy2#
这可能不直接适用于您的问题,但我发现这个症状可能,在我的情况下,是由我的编辑器的选择'mcedit'(午夜指挥官)
为了缓解bug问题,我在.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。
pkwftd7m3#
要在终端中禁用括号粘贴模式,请运行以下命令:
hfyxw5xn4#
要在Linux上全局禁用括号粘贴,请将以下行添加到
~/.inputrc
:仅在当前运行的Xterm(v 372)(运行bash shell版本5.1.16(可能也更早,但我不知道))中禁用:
使用上述两种方法中的任何一种,您都可以以明显的方式重新启用括号粘贴(在当前的Xterm中),即:
wtzytmuj5#
如果你想立即停止使用前缀/后缀(
00~
,01~
),你可以在终端CLI中使用just type:而且效果会很好