18

Я использую iTerm2 2.1.1 на Yosemite. Нет 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. Некоторые из Google предположили, что это проблема «фокуса», но что такое «фокус» в значениях терминала, и есть ли способ отключить или избежать этого?

5 ответов5

17

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

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

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

9

У меня нет 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" (чтобы отключить функцию, как описано в исправлении выше).
  • Повторите шаги « Run xeyes , Switch Focus », описанные выше, но на этот раз не увидите символов, вводимых в терминал.

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

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

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 для преобразования машинописных файлов в читаемую форму для этой цели.

0

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

-2

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .