如何在Mac OS X默认终端上禁用“括号粘贴模式”中的奇怪字符?

时间:2017-02-13 19:33:24

标签: linux macos

我的终端遇到问题,当我粘贴文字时,它以00~为前缀,后缀为01~

例如,我将突出显示文字并按Command-C。然后我将Command-V推入终端,我看到文本的开头和结尾都会弹出那些奇怪的字符。

例如,我可以突出显示text并将其粘贴到终端中。然后我看到00~text01~

文本可以来自任何地方,甚至来自终端本身。我没有安装任何复制/粘贴插件,这只是普通的复制/粘贴。我正在使用默认的Mac终端而没有任何修改。

我做了一些在线搜索,显然Paste将文本包装成特殊字符,以便某些应用程序会看到这是粘贴的文本并将正确处理它。但是,终端没有正确处理,因此不会删除奇怪的字符。显然,这种粘贴模式称为“括号粘贴模式”http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Bracketed-Paste-Mode

我发现另一个问题就如何在linux机器上解决这个问题提供了解决方案,但在尝试该解决方案之后我仍然遇到同样的问题。

有人可以告诉我如何禁用终端的括号粘贴模式吗?或者告诉我摆脱这些令人讨厌的角色的正确方法?

2 个答案:

答案 0 :(得分:3)

这可能不会直接适用于您的问题,但在我的情况下,我发现这种症状可能是由我的选择编辑'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。

答案 1 :(得分:2)

粘贴文本时会发生什么

  1. Text已进入"系统" (例如X,MacOS / Aqua)从某个地方复制缓冲区,可能来自同一个终端。这里的文字没有改变。

  2. 将文字粘贴到终端;也就是说," system"看到终端(例如xterm)从复制缓冲区接收未改变的字符序列。终端知道这是粘贴,而不是键盘输入。

  3. 终端将缓冲区中的char序列发送到前台运行的程序(shell,编辑器等)。对于程序,所接收的数据与通过键盘的用户输入无法区分。

  4. 讨论

    这种透明度(或不透明度等等)往往是一个好东西,就像透明管道管道的Unix范例一般。但有时程序可以更好地处理数据,如果他们知道它被粘贴了。例如,像vim这样的编辑器可以关闭自动缩进 - 毕竟,代码可能已经缩进了!

    括号内的粘贴

    输入括号内的粘贴。由于主要原因,透明数据管道的范例无法改变;但是数据可以用序列进行修饰,这些序列通常不会出现在终端输入中以标记其开始和结束。如果终端是这样配置的 - 对于xterm,配置将发送ESC [ ? 2 0 0 4 l - 粘贴的数据用转义序列括起来:ESC [ 2 0 0 ~ <buffer contents> ESC [ 2 0 1 ~

    前台程序收到这个&#34;装饰&#34;数据,它可以由程序来处理。一个天真的程序将所有这些视为用户输入,这就是你所看到的。

    疗法

    您的情况有两个问题:终端在括号粘贴模式下意外终止;和接收程序 - 可能是shell - 没有处理它。

    • 一个解决方案是user83536:识别使终端处于该状态的程序,并通过一个包装器调用它,该程序包在程序结束后再次关闭括号中的粘贴模式。

      < / LI>
    • 该程序可能尝试关闭括号中的粘贴模式但失败了。一个原因可能是它发送了错误的转义序列。尝试将TERMINAL环境变量设置为最能描述终端的值。

    • 尝试在违规应用程序中关闭括号中的粘贴。在vim中,人们会说set t_BE=。这可以防止vim将终端置于括号粘贴模式,当它在会话中设置时,发送&#34;结束括号粘贴模式&#34;到终点站。

    • 拥抱括号内的糊状物。这似乎是个好主意。对于使用readline的bash和其他程序,可以使用set enable-bracketed-paste on。对于vim,可以遵循建议here.