我在 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
答案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 来说,解决此问题的最简单方法是打开“首选项”->“高级”,向下滚动到终端,然后将“应用程序可以打开焦点报告”设置为“否”。