"^ [[O" і "^ [[I" з'являються на iTerm2, коли фокус втрачається


23

Я використовую iTerm2 2.1.1 на Yosemite. Без tmux.

Коли iTerm втрачає фокус (при переключенні на іншу програму Cmd-Tab або натисканні іншого вікна), a ^[[Iі, ^[[Oздається, надсилається до терміналу. Це спричиняє появу a ^[[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. Деякі Googling припустили, що це питання "фокус", але що таке "фокус" у значеннях терміналу, і чи є спосіб відключити або уникнути цього?


Це, мабуть, відтворюється, коли я пишу японську (на Vim), але я все ще не впевнений, яка дія є причиною ...
osyoyu

Відповіді:


25

Відповідно до цього :

Додайте підтримку для втраченого / отриманого фокусу звітності. esc [? 1004h вмикає його; тоді термінал посилає esc [I при фокусуванні, esc [O при знеціненні. Надішліть esc [? 1004l для відключення.

Cmd- Rдля скидання буде вимкнено звітування про фокус (завдяки цьому )


1
Cmd-R- це магічна послідовність для мене
bruceg

Тож корисно, дякую. Це знадобило мені довгий час, щоб знайти SEO на цьому Google: mac iterm iterm2 відображення вмісту буфера обміну vim ex buffer focus
bsb

11

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

Запустіть таку команду оболонки всередині терміналу, де ви бачите проблему:

printf "\e[?1004l"

(Зверніть увагу, що останній символ є маленьким 'ell'.)

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


У Linux я можу продемонструвати цю контрольну послідовність, працюючи з наступними кроками:

  • Запустіть xtermта увімкніть функцію, запустивши printf "\e[?1004h"її.
  • Запустіть xeyesабо інший GUI-додаток із того самого 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?).
osyoyu

Отже ... хтось міг би сказати, як саме "сказати Віму ігнорувати \ e [O і \ e [I"?
Лібін Вень

0

Щоб вирішити цю проблему, ви повинні знати, яка програма дозволяє режимі фокусування звітів. Вам слід взяти журнал, записаний командою script (1) .


Чи функція Focus Reporting - функція, яка за замовчуванням вимкнена, і увімкнена послідовністю відходу? Насправді я помітив, що ця проблема не виникає у новому вікні терміналу, а відтворюється після чогось , тому спробую визначити це.
osyoyu

-2

Я знайшов це питання, намагаючись вирішити мій термінал із відображенням "^ @", коли фокус втрачено.

Читаючи відповіді, я спробував перейти до налаштувань iTerm2 -> Профілі -> "За замовчуванням" -> Сесія та зніміть прапорець: "У режимі очікування надсилайте код ASCII 0 кожні 60 секунд"

Проблема вирішена, сподіваюся, що вона комусь допоможе

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.