Я использую 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 предположили, что это проблема «фокуса», но что такое «фокус» в значениях терминала, и есть ли способ отключить или избежать этого?
Ответы:
Согласно этому :
Cmd- Rдля сброса будет отключена фокусировка отчетов (благодаря этому )
источник
Cmd-R
это волшебная последовательность для меняУ меня нет Mac, пригодного для проверки этого ответа, но я сталкиваюсь с этой проблемой в XTerm под Linux очень редко, и (при условии, что iTerm2 учитывает те же управляющие коды), вы можете найти приведенное ниже исправление полезным.
Запустите следующую команду оболочки внутри терминала, где вы видите проблему:
(Обратите внимание, что последним символом является строчный 'ell'.)
Эта последовательность управления ANSI похожа на последовательность, указанную в ответе Томаса Дики, но она отключает (а не включает) функцию. Это должно решить вашу проблему во всех приложениях, а не только в Vim, путем предотвращения появления символов вообще.
В Linux я могу продемонстрировать эту последовательность управления, работая со следующими шагами:
xterm
и включите функцию, запустивprintf "\e[?1004h"
в ней.xeyes
или другое приложение с графическим интерфейсом из того же XTerm . (По какой-то причине этот эффект не произойдет для меня, пока рассматриваемый XTerm не запустит приложение. Кто-нибудь знает почему?)^[[O
и^[[I
вводите текст в исходный XTerm.printf "\e[?1004l"
(чтобы отключить эту функцию, как описано в исправлении выше).xeyes
, переключи фокус » выше, но на этот раз не увидишь символов, вводимых в терминал.Я лично вижу эту проблему только в том случае, если случайно выгрузил двоичный вывод в терминал, но если вы сталкиваетесь с ним более регулярно, вы можете добавить
printf
его в интерактивный сценарий запуска вашей оболочки (например~/.bashrc
). Похоже, что отправка контрольного кода, если функция уже отключена, не причиняет вреда (по крайней мере, в XTerm), поэтому она должна быть безопасной, даже если вы иногда видите эту проблему только иногда.Если вы беспокоитесь о том, что ваша оболочка всегда генерирует этот вывод, возможно, из-за того, что вы иногда используете ее в местах, которые плохо обрабатывают эти управляющие коды, или если проблема иногда возникает после запуска оболочки, тогда вы можете установить создать псевдоним (например, с помощью
alias focusfix='printf "\e[?1004l"'
), чтобы сделать его более удобным для запуска вручную.источник
Термин «фокус» относится к тому, какой терминал (или окно) в настоящее время принимает события ввода с клавиатуры и мыши. Только один может иметь фокус; Существуют протоколы для определения того, как получить и потерять фокус в графической среде, что было бы бесполезно исследовать.
Из описания (см. Также индикатор текущей панели Tmux после восстановления фокуса ) видно, что iTerm2 реализует эту
xterm
функцию:Он включен в частном режиме 1004 (добавлен в xterm в 2007 году, патч № 224 ):
и может быть связано с этим патчем: Vim - Добавлена поддержка режима отчета о фокусе (DECSET / DECRST 1004), работающего на xterm-совместимых терминалах , который приравнивает все поведение функций мыши «xterm» в одной настройке:
Итак ... вы можете отключить это , сказав vim, что ваш терминал не использует протокол мыши xterm. Цитируемый патч говорит vim включить функцию FocusIn / FocusOut (которая обычно должна быть отключена), и если в ее логике есть какой-то недостаток, она может оставить эту функцию включенной после выхода из vim.
Хотя vim является наиболее вероятной причиной включения режима, возможно, что какая-то другая программа (или скрипт) включит его. Как предлагается в другом ответе, вы можете сузить это, собирая выходные данные на свой терминал, используя
script
программу (создаваяtypescript
файл). Анализ может занять много времени (и поскольку этот сайт не поддерживает вложения , он не подходит для подробного обсуждения). Я обычно используюunmap
для преобразования машинописных файлов в читаемую форму для этой цели.источник
\e\[O
и\e\[I
решать эту проблему в Vim, но не в других приложениях, таких как cat или inrails server
(может быть, в программах, использующих readline?).Чтобы решить эту проблему, вы должны знать, в какой программе включен режим фокуса. Вы должны взять журнал, записанный командой script (1) .
источник
Я нашел этот вопрос, пытаясь решить мой терминал, отображающий «^ @», когда фокус был потерян.
Прочитав ответы, я попытался перейти к настройкам iTerm2 -> Профили -> «По умолчанию» -> Сеанс и снять отметку: «В режиме ожидания отправляйте код ASCII 0 каждые 60 секунд»
Проблема решена, надеюсь, кому-то это поможет
источник