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), ^[[I
a ^[[O
wydaje się być wysyłane do terminala. Powoduje to ^[[I^[[O
pojawienie 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?
Odpowiedzi:
Zgodnie z tym :
Cmd- Rzresetowanie spowoduje wyłączenie raportowania aktywności (dzięki temu )
źródło
Cmd-R
to dla mnie magiczna sekwencjaNie 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:
(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:
xterm
i włącz tę funkcję, uruchamiającprintf "\e[?1004h"
ją.xeyes
lub 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?)^[[O
i^[[I
„wpisuj” się do oryginalnego XTerm.printf "\e[?1004l"
(aby wyłączyć tę funkcję, jak opisano w powyższej poprawce).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
printf
do 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.źródło
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ę
xterm
funkcję:Jest włączony przez tryb prywatny 1004 (dodany do xterm w 2007, łatka # 224 ):
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:
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ą
script
programu (tworząctypescript
plik). 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żywamunmap
do przekształcania plików maszynopisu w czytelną formę.źródło
\e\[O
i\e\[I
rozwiązał ten problem w Vimie, ale nie w innych aplikacjach, takich jak cat lub inrails server
(może programy używające readline?).Aby rozwiązać ten problem, musisz wiedzieć, który program włącza tryb raportowania fokusowego. Powinieneś wziąć dziennik zapisany za pomocą polecenia script (1) .
źródło
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
źródło