„^ [[O” i „^ [[I”) pojawiające się na iTerm2 po utracie ostrości

23

Używam iTerm2 2.1.1 na Yosemite. Bez tmux.

Kiedy iTerm traci fokus (po przełączeniu do innej aplikacji przez Cmd-Tab lub kliknięciu innego okna), ^[[Ia ^[[Owydaje się być wysyłane do terminala. Powoduje to ^[[I^[[Opojawienie się a lub bardziej frustracji w Vimie, ta kombinacja otwiera kolejny mały bufor.

Przykład: Naciśnięcie Cmd-Tab kilka razy po uruchomieniu cat

% cat
^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I

Dzieje się tak tylko w iTerm, a nie w Terminal.app. Ponadto odtwarza się na bash lub sh, więc nie wydaje się to być problemem zsh. Niektórzy Googling zasugerowali, że jest to kwestia „skupienia”, ale czym jest „skupienie” w znaczeniu terminala i czy jest jakiś sposób na wyłączenie lub uniknięcie tego?

osyoyu
źródło
Wydaje się, że to się powtarza, kiedy piszę po japońsku (w Vimie), ale wciąż nie jestem pewien, jakie działanie jest przyczyną ...
osyoyu

Odpowiedzi:

25

Zgodnie z tym :

Dodaj obsługę utraconego / uzyskanego fokusu raportowania. esc [? 1004h włącza go; następnie terminal wysyła esc [I podczas ustawiania ostrości, esc [O podczas usuwania nastawy]. Wyślij esc [? 1004l, aby wyłączyć.

Cmd- Rzresetowanie spowoduje wyłączenie raportowania aktywności (dzięki temu )

Yichuan Wang
źródło
1
Cmd-Rto dla mnie magiczna sekwencja
bruceg
Bardzo pomocny, dzięki. Zajęło mi to dużo czasu, aby znaleźć więc SEO tego Google: mac iterm iterm2 wyświetl zawartość schowka vim ex focus focus
bsb
11

Nie mam komputera Mac pod ręką, aby przetestować tę odpowiedź, ale bardzo rzadko spotykam się z tym problemem w XTerm pod Linuksem i (zakładając, że iTerm2 szanuje te same kody kontrolne), poniższa poprawka może być pomocna.

Uruchom następującą komendę powłoki w terminalu, w którym występuje problem:

printf "\e[?1004l"

(Zauważ, że ostatnim znakiem jest małe „ell”.)

Ta sekwencja kontrolna ANSI jest podobna do tej wymienionej w odpowiedzi Thomasa Dickeya, ale wyłącza tę funkcję (a nie ją włącza). Powinien rozwiązać Twój problem we wszystkich aplikacjach, nie tylko w Vimie, w ogóle uniemożliwiając pojawienie się postaci.


W systemie Linux mogę zademonstrować tę sekwencję sterującą, wykonując następujące czynności:

  • Uruchom xtermi włącz tę funkcję, uruchamiając printf "\e[?1004h"ją.
  • Uruchom xeyeslub inną aplikację GUI z tego samego XTerm . (Z jakiegoś powodu ten efekt nie występuje, dopóki XTerm nie uruchomi aplikacji. Czy ktoś wie dlaczego?)
  • Wielokrotnie przełącz fokus na oryginalny XTerm i na zewnątrz (np. Klikając okno) i zobacz ^[[Oi ^[[I„wpisuj” się do oryginalnego XTerm.
  • Teraz zamknij Xeyes, wróć do oryginalnego XTerm i uruchom printf "\e[?1004l"(aby wyłączyć tę funkcję, jak opisano w powyższej poprawce).
  • Powtórz powyższe kroki „ biegnij xeyes, przełącz fokus ”, ale tym razem nie widzę znaków wprowadzanych do terminala.

Osobiście widzę ten problem tylko wtedy, gdy przypadkowo zrzuciłem dane binarne do terminala, ale jeśli napotykasz go częściej, możesz chcieć dodać to printfdo interaktywnego skryptu uruchamiania powłoki (np ~/.bashrc.). Wydaje się, że nie ma żadnej szkody (przynajmniej w XTerm) w wysyłaniu kodu kontrolnego, jeśli ta funkcja jest już wyłączona, więc powinna być bezpieczna, nawet jeśli czasami widzisz ten problem.

Jeśli obawiasz się, że powłoka zawsze generuje takie dane wyjściowe, być może dlatego, że czasami używasz go w miejscach, które nie obsługują dobrze tych kodów kontrolnych, lub jeśli problem czasami pojawia się po uruchomieniu powłoki, możesz ustawić w górę aliasu (np. z alias focusfix='printf "\e[?1004l"'), aby wygodniej było uruchamiać go ręcznie.

Paul Whittaker
źródło
Używam Linuksa Manjaro, Gnome'a, terminatora i oh-my-zsh. Ten problem mi się przytrafił i ta odpowiedź bardzo mi pomogła.
Fabio Montefuscolo
2

Termin „fokus” odnosi się do tego, który terminal (lub okno) akceptuje obecnie zdarzenia wejściowe klawiatury i myszy. Tylko jeden może się skupić; istnieją protokoły ustalania, jak uzyskać i stracić koncentrację w środowisku graficznym, których eksploracja nie byłaby pomocna.

Z opisu (patrz także wskaźnik panelu prądu Tmux po odzyskaniu ostrości ) wygląda na to, że iTerm2 implementuje tę xtermfunkcję:

FocusIn / FocusOut

FocusIn / FocusOut można łączyć z dowolnymi zdarzeniami myszy, ponieważ używa on innego protokołu. Po ustawieniu powoduje, że xterm wysyła CSI I, gdy terminal zyskuje fokus, a CSI O, gdy traci fokus.

Jest włączony przez tryb prywatny 1004 (dodany do xterm w 2007, łatka # 224 ):

CSI ? Pm h
      DEC Private Mode Set (DECSET).
           Ps = 1 0 0 4  -> Send FocusIn/FocusOut events. 

i może być związany z tą poprawką: Vim - Dodaj obsługę trybu raportowania aktywności (DECSET / DECRST 1004) działa na terminalach kompatybilnych z xterm , co zrównuje wszystkie funkcje myszy „xterm” w jednym ustawieniu:

Raportowanie ostrości / * jest obsługiwane przez terminale kompatybilne z Xterm i tmux. * /

Więc ... możesz to wyłączyć , mówiąc vimowi, że twój terminal nie używa protokołu myszy xterm. Cytowana łatka mówi vimowi, aby włączył funkcję FocusIn / FocusOut (która normalnie powinna być wyłączona), a jeśli jest jakaś wada w jego logice, może pozostawić tę funkcję włączoną po wyjściu z vima.

Chociaż vim jest najbardziej prawdopodobną przyczyną włączenia tego trybu, możliwe jest, że jakiś inny program (lub skrypt) go włączy. Jak zasugerowano w innej odpowiedzi, można to zawęzić, zbierając dane wyjściowe do terminala za pomocą scriptprogramu (tworząc typescriptplik). Analiza, która może być czasochłonna (a ponieważ ta witryna wydaje się nie obsługiwać załączników , nie wydaje się odpowiednia do zachęcania do szczegółowej dyskusji). W tym celu zwykle używam unmapdo przekształcania plików maszynopisu w czytelną formę.

Thomas Dickey
źródło
Dziękuję za szczegółową odpowiedź. Mówienie Vimowi, aby zignorował \e\[Oi \e\[Irozwiązał ten problem w Vimie, ale nie w innych aplikacjach, takich jak cat lub in rails server(może programy używające readline?).
osyoyu
Więc ... czy ktokolwiek mógłby powiedzieć, jak dokładnie „każe Vimowi zignorować \ e [O i \ e [ja”?
Libin Wen
0

Aby rozwiązać ten problem, musisz wiedzieć, który program włącza tryb raportowania fokusowego. Powinieneś wziąć dziennik zapisany za pomocą polecenia script (1) .

Hayaki Saito
źródło
Czy Focus Reporting jest funkcją domyślnie wyłączoną i włączoną sekwencją zmiany znaczenia? W rzeczywistości zauważyłem, że ten problem nie występuje w nowym oknie terminala, ale odtwarza się po zrobieniu czegoś , więc spróbuję go zidentyfikować.
osyoyu
-2

Znalazłem to pytanie, próbując rozwiązać problem z terminalem wyświetlającym „^ @” po utracie skupienia.

Czytając odpowiedzi, próbowałem przejść do preferencji iTerm2 -> Profile -> „Domyślne” -> Sesja i odznaczenie: „W stanie bezczynności wysyłaj kod ASCII 0 co 60 sekund”

Problem rozwiązany, mam nadzieję, że komuś pomoże

MauricioOtta
źródło