失去焦点时 iTerm2 上出现“^[[O” 和 “^[[I”

失去焦点时 iTerm2 上出现“^[[O” 和 “^[[I”

我在 Yosemite 上使用 iTerm2 2.1.1。没有 tmux。

当 iTerm 失去焦点时(通过 Cmd-Tab 切换到另一个应用程序或单击另一个窗口时),似乎会将^[[I^[[O发送到终端。这会导致^[[I^[[O出现 ,或者更令人沮丧的是,在 Vim 中,此组合会打开另一个小缓冲区。

示例:启动后多次按 Cmd-Tabcat

% cat
^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I

这只发生在 iTerm 上,而不会发生在 Terminal.app 上。此外,它在 bash 或 sh 上重现,因此这似乎不是 zsh 的问题。一些谷歌搜索认为这是一个“焦点”问题,但终端中的“焦点”是什么意思,有什么方法可以禁用或避免这种情况?

答案1

根据

添加报告焦点丢失/获得的支持。esc[?1004h 将其打开;然后终端在聚焦时发送 esc[I,在失焦时发送 esc[O。发送 esc[?1004l 以禁用。

Cmd-R重置将关闭焦点报告(感谢

答案2

我手边没有 Mac 来测试这个答案,但我偶尔会在 Linux 下的 XTerm 中遇到这个问题(假设 iTerm2 遵循相同的控制代码)你可能会发现下面的修复很有帮助。

在出现问题的终端内运行以下 shell 命令:

printf "\e[?1004l"

(请注意,那里的最后一个字符是小写的“ell”。)

此 ANSI 控制序列与 Thomas Dickey 的答案中列出的类似,但它关闭了该功能(而不是打开)。它应该可以解决所有应用程序中的问题,而不仅仅是 Vim,因为它可以完全阻止字符出现。


在 Linux 上,我可以通过以下步骤演示此控制序列的工作原理:

  • 运行xterm并通过在其中运行来启用该功能printf "\e[?1004h"
  • 运行xeyes或其他 GUI 应用程序来自同一个 XTerm。(由于某种原因,直到有问题的 XTerm 启动应用程序时,这种效果才会发生。有人知道为什么吗?)
  • 反复将焦点切换至原始 XTerm 之内和之外(例如通过单击窗口)并查看^[[O并被^[[I“输入”到原始 XTerm 中。
  • 现在关闭 Xeyes,返回到原始 XTerm,然后运行printf "\e[?1004l"(以禁用该功能,如上面的修复中所述)。
  • 重复“运行xeyes,切换焦点“上述步骤,但这次在终端中看不到输入的字符。

我个人只有在无意中将二进制输出转储到终端时才会看到这个问题,但如果你经常遇到这种情况,你可能希望将其添加printf到 shell 的交互式启动脚本中(例如~/.bashrc)。如果该功能已被禁用,则发送控制代码似乎没有任何危害(至少在 XTerm 下),因此即使你只是偶尔看到这个问题,也应该是安全的。

如果您担心您的 shell 总是生成该输出,可能是因为您有时在不能很好处理这些控制代码的地方使用它,或者问题有时在 shell 启动后触发,那么您可能更愿意设置一个别名(例如使用alias focusfix='printf "\e[?1004l"')以使其更方便手动运行。

答案3

“焦点”是指哪个终端(或窗口)当前正在接受键盘和鼠标输入事件。只有一个可以获得焦点;有协议用于确定如何在图形环境中获得和失去焦点,但探索这些协议不会有什么帮助。

根据描述(另见重新获得焦点时 Tmux 当前窗格指示器),看来 iTerm2 实现了这个xterm功能:

聚焦/失焦

FocusIn/FocusOut 可以与任何鼠标事件结合使用,因为它使用不同的协议。设置后,它会导致 xterm 在终端获得焦点时发送 CSI I,在失去焦点时发送 CSI O。

它由私有模式 1004 启用(2007 年添加到 xterm,补丁 #224):

CSI ? Pm h
      DEC Private Mode Set (DECSET).
           Ps = 1 0 0 4  -> Send FocusIn/FocusOut events. 

可能与此补丁有关:Vim - 添加对焦点报告模式 (DECSET/DECRST 1004) 的支持,适用于 xterm 兼容终端,它在一个设置中等同于“xterm”鼠标功能的所有行为:

/* 焦点报告受 xterm 兼容终端和 tmux 支持。 */

因此...你可以禁用通过告诉 vim 您的终端不使用 xterm 鼠标协议。引用的补丁告诉 vim 打开 FocusIn/FocusOut 功能(通常应关闭),并且如果其逻辑存在某些缺陷,则可能在退出 vim 后使该功能保持启用状态。

虽然 vim 是启用该模式的最可能原因,但其他程序(或脚本)也可能启用该模式。正如另一个答案所建议的那样,您可以通过使用以下命令将输出收集到终端来缩小范围script程序(生成typescript文件)。分析它可能很耗时(而且由于该网站似乎不支持附件,似乎不适合征求详细的讨论)。我一般使用unmap为此目的,将 Typescript 文件转换为可读形式。

答案4

具体对于 iTerm 来说,解决此问题的最简单方法是打开“首选项”->“高级”,向下滚动到终端,然后将“应用程序可以打开焦点报告”设置为“否”。

相关内容