«^ [[O» и «^ [[I» появляются на iTerm2 при потере фокуса

23

Я использую iTerm2 2.1.1 на Yosemite. Нет Tmux.

Когда iTerm теряет фокус (когда он переключается на другое приложение с помощью Cmd-Tab или щелкает другое окно), a ^[[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. Некоторые из Google предположили, что это проблема «фокуса», но что такое «фокус» в значениях терминала, и есть ли способ отключить или избежать этого?

osyoyu
источник
Кажется, это воспроизводится, когда я пишу по-японски (в Vim), но я все еще не уверен, какое действие является причиной ...
Осю

Ответы:

25

Согласно этому :

Добавить поддержку для сообщения о потерянном / полученном фокусе. esc [? 1004h включает его; затем терминал отправляет esc [I при фокусировке, esc [O при фокусировке. Отправить Esc [? 1004l, чтобы отключить.

Cmd- Rдля сброса будет отключена фокусировка отчетов (благодаря этому )

Ичуань Ван
источник
1
Cmd-Rэто волшебная последовательность для меня
Брюсег
Так полезно, спасибо. Это заняло у меня много времени, чтобы найти SEO для этого Google: mac iterm iterm2 показать содержимое буфера обмена vim ex focus focus
bsb
11

У меня нет Mac, пригодного для проверки этого ответа, но я сталкиваюсь с этой проблемой в XTerm под Linux очень редко, и (при условии, что iTerm2 учитывает те же управляющие коды), вы можете найти приведенное ниже исправление полезным.

Запустите следующую команду оболочки внутри терминала, где вы видите проблему:

printf "\e[?1004l"

(Обратите внимание, что последним символом является строчный 'ell'.)

Эта последовательность управления ANSI похожа на последовательность, указанную в ответе Томаса Дики, но она отключает (а не включает) функцию. Это должно решить вашу проблему во всех приложениях, а не только в Vim, путем предотвращения появления символов вообще.


В Linux я могу продемонстрировать эту последовательность управления, работая со следующими шагами:

  • Запустите xtermи включите функцию, запустив printf "\e[?1004h"в ней.
  • Запустите xeyesили другое приложение с графическим интерфейсом из того же XTerm . (По какой-то причине этот эффект не произойдет для меня, пока рассматриваемый XTerm не запустит приложение. Кто-нибудь знает почему?)
  • Повторно переключайте фокус в исходный XTerm и из него (например, нажимая на окна) и смотрите ^[[Oи ^[[Iвводите текст в исходный XTerm.
  • Теперь закройте Xeyes, вернитесь к исходному XTerm и запустите printf "\e[?1004l"(чтобы отключить эту функцию, как описано в исправлении выше).
  • Повторите шаги « беги xeyes, переключи фокус » выше, но на этот раз не увидишь символов, вводимых в терминал.

Я лично вижу эту проблему только в том случае, если случайно выгрузил двоичный вывод в терминал, но если вы сталкиваетесь с ним более регулярно, вы можете добавить printfего в интерактивный сценарий запуска вашей оболочки (например ~/.bashrc). Похоже, что отправка контрольного кода, если функция уже отключена, не причиняет вреда (по крайней мере, в XTerm), поэтому она должна быть безопасной, даже если вы иногда видите эту проблему только иногда.

Если вы беспокоитесь о том, что ваша оболочка всегда генерирует этот вывод, возможно, из-за того, что вы иногда используете ее в местах, которые плохо обрабатывают эти управляющие коды, или если проблема иногда возникает после запуска оболочки, тогда вы можете установить создать псевдоним (например, с помощью alias focusfix='printf "\e[?1004l"'), чтобы сделать его более удобным для запуска вручную.

Пол Уиттакер
источник
Я использую Manjaro linux, Gnome, терминатор и о-о-о-о-о. Эта проблема происходила со мной, и этот ответ очень помог.
Фабио Монтефусколо
2

Термин «фокус» относится к тому, какой терминал (или окно) в настоящее время принимает события ввода с клавиатуры и мыши. Только один может иметь фокус; Существуют протоколы для определения того, как получить и потерять фокус в графической среде, что было бы бесполезно исследовать.

Из описания (см. Также индикатор текущей панели Tmux после восстановления фокуса ) видно, что iTerm2 реализует эту xtermфункцию:

FocusIn / FocusOut

FocusIn / FocusOut можно комбинировать с любыми событиями мыши, поскольку он использует другой протокол. Когда установлено, он заставляет xterm отправлять CSI I, когда терминал получает фокус, и CSI O, когда он теряет фокус.

Он включен в частном режиме 1004 (добавлен в xterm в 2007 году, патч № 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 игнорировать \e\[Oи \e\[Iрешать эту проблему в Vim, но не в других приложениях, таких как cat или in rails server(может быть, в программах, использующих readline?).
Осюю
Итак ... кто-нибудь может сказать, как именно "сказать Vim игнорировать \ e [O и \ e [I"? »
Либин Вэнь
0

Чтобы решить эту проблему, вы должны знать, в какой программе включен режим фокуса. Вы должны взять журнал, записанный командой script (1) .

Хаяки Сайто
источник
Является ли Focus Reporting функцией, которая по умолчанию отключена и включена управляющей последовательностью? На самом деле, я заметил, что эта проблема не возникает в новом окне терминала, но воспроизводится после выполнения чего-либо , поэтому я попытаюсь определить это.
Осюю
-2

Я нашел этот вопрос, пытаясь решить мой терминал, отображающий «^ @», когда фокус был потерян.

Прочитав ответы, я попытался перейти к настройкам iTerm2 -> Профили -> «По умолчанию» -> Сеанс и снять отметку: «В режиме ожидания отправляйте код ASCII 0 каждые 60 секунд»

Проблема решена, надеюсь, кому-то это поможет

MauricioOtta
источник