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

6vl6ewon  于 2023-04-11  发布在  Linux
关注(0)|答案(5)|浏览(307)

我的终端遇到了一个问题,当我粘贴文本时,它的前缀是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机器上解决这个问题的解决方案,但在尝试了那个解决方案之后,我仍然有同样的问题。
有人能告诉我如何禁用终端的括号粘贴模式吗?或者告诉我如何摆脱这些烦人的字符?

7qhs6swi

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 --不处理它。

  • 一个解决方案是user 83536的:识别使终端处于该状态的程序,并通过一个 Package 器调用它,该 Package 器在程序结束后简单地再次关闭括号粘贴模式。
  • 该程序可能试图关闭括号粘贴模式但失败。一个原因可能是它发送了错误的转义序列。请尝试将TERMINAL环境变量设置为最能描述您的终端的值。
  • 尝试关闭有问题的应用程序中的括号粘贴。在vim中,可以说set t_BE=。这可以防止vim将终端置于括号粘贴模式,并且当它在会话中设置时,会向终端发送“结束括号粘贴模式”。
  • 拥抱括号粘贴。这似乎是一个好主意。对于bash和其他使用readline的程序,可以使用set enable-bracketed-paste on。对于vim,可以遵循建议here.
k7fdbhmy

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。

pkwftd7m

pkwftd7m3#

要在终端中禁用括号粘贴模式,请运行以下命令:

printf '\e[?2004l'
hfyxw5xn

hfyxw5xn4#

要在Linux上全局禁用括号粘贴,请将以下行添加到~/.inputrc

set enable-bracketed-paste 0

仅在当前运行的Xterm(v 372)(运行bash shell版本5.1.16(可能也更早,但我不知道))中禁用:

% bind 'set enable-bracketed-paste 0'

使用上述两种方法中的任何一种,您都可以以明显的方式重新启用括号粘贴(在当前的Xterm中),即:

% bind 'set enable-bracketed-paste 1'
wtzytmuj

wtzytmuj5#

如果你想立即停止使用前缀/后缀(00~01~),你可以在终端CLI中使用just type

$reset

而且效果会很好

相关问题