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
xterm
i włącz tę funkcję, uruchamiając printf "\e[?1004h"
ją.
- Uruchom
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?)
- Wielokrotnie przełącz fokus na oryginalny XTerm i na zewnątrz (np. Klikając okno) i zobacz
^[[O
i ^[[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 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.