失去焦点时,iTerm2上显示“ ^ [[O”和“ ^ [[I””


23

我在优胜美地上使用iTerm2 2.1.1。没有tmux。

当的iTerm失去焦点(当切换到由Cmd的-Tab键的另一应用或点击另一个窗口),一个^[[I^[[O似乎要被发送到所述终端。这会导致^[[I^[[O在Vim中出现,或更令人沮丧的是,这种组合打开了另一个小缓冲区。

示例:启动后多次按Cmd-Tab键 cat

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

这仅在iTerm上发生,而不在Terminal.app上发生。另外,它可以在bash或sh上复制,因此似乎不是zsh问题。一些谷歌搜索建议这是一个“焦点”问题,但是“焦点”在终端的意义上是什么,有什么方法可以禁用或避免这种情况?


当我在Vim中写日语时,这似乎可以重现,但是我仍然不确定是什么原因造成的……
osyoyu 2015年

Answers:


25

根据

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

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


1
Cmd-R对我来说是神奇的顺序
bruceg

非常有帮助,谢谢。这花了我很长时间才找到这个Google搜索引擎优化:mac iterm iterm2显示剪贴板内容vim ex缓冲区焦点
bsb

11

我没有Mac可以方便地测试此答案,但我偶尔会在Linux下的XTerm中遇到此问题,并且(假设iTerm2遵循相同的控制代码),您可能会发现以下修复很有用。

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

printf "\e[?1004l"

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

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


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

  • 运行xterm并启用该功能printf "\e[?1004h"
  • 从同一XTerm运行xeyes或其他GUI应用程序。(由于某种原因,在有问题的XTerm启动应用程序之前,对我而言不会发生这种影响。有人知道为什么吗?)
  • 重复地将焦点移入和移出原始XTerm(例如,通过单击Windows),然后查看^[[O^[[I“键入”原始XTerm。
  • 现在关闭Xeyes,返回到原始XTerm,然后运行printf "\e[?1004l"(以禁用该功能,如上面的修复程序所述)。
  • 重复上述“ 运行xeyes,切换焦点 ”步骤,但是这次没有在终端中输入任何字符。

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

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


我正在运行Manjaro linux,Gnome,终止符和oh-my-zsh。这个问题发生在我身上,这个答案很有帮助。
Fabio Montefuscolo

2

术语“焦点”是指当前哪个终端(或窗口)正在接受键盘和鼠标输入事件。只有一个人可以专注。有一些协议可以确定如何在图形环境中获得和失去焦点,这对探索无济于事。

从描述中(在重新获得焦点时,另请参阅Tmux当前窗格指示器),看来iTerm2实现了此xterm功能:

聚焦/聚焦

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

它由私有模式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为此,我通常使用将打字稿文件转换为可读形式。


感谢您的详细回答。告诉Vim在Vim中忽略\e\[O\e\[I解决此问题,但在cat之类的其他应用程序rails server(或使用readline的程序)中则不能。
osyoyu

所以...谁能说出“告诉Vim忽略\ e [O和\ e [I]”的精确程度?
Libin Wen

0

要解决此问题,您必须知道哪个程序启用了焦点报告模式。您应该获取由script(1)命令记录的日志。


Focus Reporting功能是否默认情况下处于关闭状态,并由转义序列打开?实际上,我注意到这个问题不会在新的终端窗口上发生,而是会在执行某些操作后重现,因此我将尝试识别它。
osyoyu

-2

我通过尝试解决终端失去焦点时显示“ ^ @”的问题找到了这个问题。

通读答案,我尝试转到iTerm2首选项->配置文件->“默认”->会话并取消选中:“空闲时,每60秒发送ASCII码0”

问题解决了,希望对别人有帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.