文章

MacOS下iterm粘贴时会被自动加上00~和01~的问题

当我们在MacOS下,从浏览器或非终端应用中复制内容到iterm终端里面的时候,经常会发现这段内容的前后会被加上00~和01~。很多时候会烦恼,但这其实是iterm的一个粘贴分界符(Bracketed Paster Mode)的功能。

1. 为什么会加上00~和01~?

这两个字符序列 (00~ 和 01~) 是 iTerm2 或其他兼容终端模拟器(如Vim、Emacs、Bash/Zsh等)启用的 粘贴分界符模式 (Bracketed Paste Mode) 的标志。

  • 00~ (或 \033[200~):表示粘贴内容的开始。
  • 01~ (或 \033[201~):表示粘贴内容的结束。

这个功能主要的目的是为了安全和正确处理粘贴内容:

  • 安全(避免恶意代码执行):当你从网页上复制一行命令(例如,一个curl命令后面跟着rm -rf /)并粘贴到终端时,如果没有分界符模式,终端会立即执行你粘贴的所有内容。分界符模式会告诉终端程序(如Bash/Zsh或文本编辑器):“现在开始,直到遇到结束标志,接收到的所有数据都是粘贴的,而不是用户键入的。” 这使得程序可以在执行前对粘贴的内容进行检查、格式化或特殊处理,从而防止意外或恶意的命令执行。

  • 正确性(文本编辑器):在Vim或Emacs等终端文本编辑器中,如果你粘贴了多行代码,如果没有这个模式,编辑器可能会将粘贴的每一行视为用户按下了Enter键,从而错误地应用自动缩进、换行等行为。有了分界符,编辑器就知道这是一段需要原样插入的文本,从而保持代码的原始格式。

2.如何禁用它?

如果你知道你在做什么(因为这是一个安全功能),那么有以下几种方式可以禁用:

永久禁用iterm的分界符模式

这是最直接的解决办法,它会彻底禁用iTerm2向Shell发送粘贴分界符。

  • 打开 iTerm2 Preferences (偏好设置)。

  • 选择 Profiles (配置文件)。

  • 选择你当前使用的配置文件(通常是 Default)。

  • 点击 Terminal (终端) 标签页。

  • 找到 Disable session-specific paste setting(或者类似名称,不同iTerm2版本可能略有不同),然后勾选它。或者,查找与 Bracketed Paste Mode 相关的选项,并将其禁用。

临时禁用iterm的分界符模式

粘贴前在终端输入 reset 会临时禁用iterm的分界符模式。

本文由作者按照 CC BY 4.0 进行授权

Comments powered by Disqus.