Aparecen “^ [[O” y “^ [[I” en iTerm2 cuando se pierde el foco

23

Estoy usando iTerm2 2.1.1 en Yosemite. No tmux.

Cuando iTerm pierde el foco (cuando se cambia a otra aplicación Comando-Tab o haciendo clic en otra ventana), una ^[[Iy ^[[Oparece ser enviado al terminal. Esto hace ^[[I^[[Oque aparezca un V, o más frustrante, en Vim, esta combinación abre otro pequeño búfer.

Ejemplo: presionar Cmd-Tab varias veces después de comenzar cat

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

Esto solo ocurre en iTerm y no en Terminal.app. Además, se reproduce en bash o sh, por lo que no parece ser un problema de zsh. Algunos Google sugirieron que este es un problema de "enfoque", pero ¿qué es "enfoque" en el significado de un terminal? ¿Hay alguna forma de desactivarlo o evitarlo?

osyoyu
fuente
Esto parece reproducirse cuando estoy escribiendo japonés (en Vim), pero todavía no estoy seguro de qué acción es la causa ...
osyoyu

Respuestas:

25

De acuerdo a esto :

Agregue soporte para informar el enfoque perdido / ganado. esc [? 1004h lo enciende; entonces el terminal envía esc [I cuando enfoca, esc [O cuando desenfoca. Enviar esc [? 1004l para deshabilitar.

Cmd- Rrestablecer desactivará los informes de enfoque (gracias a esto )

Yichuan Wang
fuente
1
Cmd-Res la secuencia mágica para mí
bruceg
Muy útil, gracias. Esto me llevó mucho tiempo encontrar el SEO de Google: mac iterm iterm2 mostrar el contenido del portapapeles vim ex buffer focus
bsb
11

No tengo una Mac a mano para probar esta respuesta, pero encuentro este problema en XTerm bajo Linux muy ocasionalmente y (suponiendo que iTerm2 respete los mismos códigos de control) puede encontrar útil la solución a continuación.

Ejecute el siguiente comando de shell dentro de la terminal donde está viendo el problema:

printf "\e[?1004l"

(Tenga en cuenta que el último carácter es un 'ell' en minúsculas).

Esta secuencia de control ANSI es como la que aparece en la respuesta de Thomas Dickey, pero desactiva la función (en lugar de activarla). Debería resolver su problema en todas las aplicaciones, no solo en Vim, evitando que los caracteres ocurran.


En Linux puedo demostrar esta secuencia de control trabajando con los siguientes pasos:

  • Ejecute xtermy habilite la función ejecutándose printf "\e[?1004h"en ella.
  • Ejecute xeyeso alguna otra aplicación GUI desde ese mismo XTerm . (Por alguna razón, este efecto no me sucede hasta que el XTerm en cuestión lanza una aplicación. ¿Alguien sabe por qué?)
  • Cambie repetidamente el foco dentro y fuera del XTerm original (por ejemplo, haciendo clic en Windows) y vea ^[[Oy ^[[Ise "teclee" en el XTerm original.
  • Ahora cierre Xeyes, regrese al XTerm original y ejecútelo printf "\e[?1004l"(para deshabilitar la función, como se describe en la corrección anterior).
  • Repita los pasos anteriores de " ejecutar xeyes, cambiar el foco ", pero esta vez no verá caracteres ingresados ​​en el terminal.

Personalmente, solo veo este problema si accidentalmente descargué la salida binaria al terminal, pero si la encuentras más regularmente, es posible que desees agregar eso printfal script de inicio interactivo de tu shell (por ejemplo ~/.bashrc). No parece haber ningún daño (al menos en XTerm) al enviar el código de control si la función ya está desactivada, por lo que debería ser seguro incluso si solo ve este problema a veces.

Si le preocupa que su shell siempre genere esa salida, tal vez porque a veces lo usa en lugares que no manejan bien esos códigos de control, o si el problema a veces se desencadena después de que se inicia el shell, entonces es posible que prefiera configurar un alias (por ejemplo, con alias focusfix='printf "\e[?1004l"') para que sea más conveniente ejecutarlo manualmente.

Paul Whittaker
fuente
Estoy ejecutando Manjaro linux, Gnome, terminator y oh-my-zsh. Este problema me estaba ocurriendo y esta respuesta me ayudó mucho.
Fabio Montefuscolo
2

El término "foco" se refiere a qué terminal (o ventana) acepta actualmente eventos de entrada de teclado y mouse. Solo uno puede tener foco; Existen protocolos para establecer cómo ganar y perder el enfoque en un entorno gráfico que no sería útil explorar.

De la descripción (vea también el indicador del panel actual de Tmux cuando se recupera el foco ), parece que iTerm2 implementa esta xtermcaracterística:

FocusIn / FocusOut

FocusIn / FocusOut se puede combinar con cualquiera de los eventos del mouse, ya que utiliza un protocolo diferente. Cuando se configura, hace que xterm envíe CSI I cuando el terminal gana el foco, y CSI O cuando pierde el foco.

Está habilitado por el modo privado 1004 (agregado a xterm en 2007, parche # 224 ):

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

y puede estar relacionado con este parche: Vim: agregar compatibilidad para el modo de informe de enfoque (DECSET / DECRST 1004) funciona en terminales compatibles con xterm , lo que iguala todo el comportamiento de las funciones del mouse "xterm" en una configuración:

/ * los informes de foco son compatibles con terminales compatibles con xterm y tmux. * /

Entonces ... podría deshabilitar eso diciéndole a vim que su terminal no usa el protocolo de mouse xterm. El parche citado le dice a vim que active la función FocusIn / FocusOut (que normalmente debería estar desactivada), y si hay algún defecto en su lógica, puede dejar la función habilitada después de salir de vim.

Si bien vim es la causa más probable de que el modo esté habilitado, es posible que algún otro programa (o script) lo active. Como se sugiere en otra respuesta, puede reducir eso recogiendo la salida a su terminal usando el scriptprograma (produciendo un typescriptarchivo). Análisis que puede llevar mucho tiempo (y dado que este sitio no parece admitir archivos adjuntos , no parece adecuado solicitar una discusión detallada). Generalmente uso unmappara transformar archivos de mecanografía en forma legible para este propósito.

Thomas Dickey
fuente
Gracias por tu respuesta detallada. Decirle a Vim que ignore \e\[Oy \e\[Iresuelva este problema en Vim, pero no en otras aplicaciones como cat o in rails server(¿quizás programas que usan readline?).
osyoyu
Entonces ... ¿alguien podría decir cómo exactamente "decirle a Vim que ignore \ e [O y \ e [I"?
Libin Wen
0

Para resolver este problema, debe saber qué programa habilita el modo de informe de enfoque. Debe tomar un registro registrado por el comando script (1) .

Hayaki Saito
fuente
¿Focus Reporting es una función que está desactivada de manera predeterminada y activada por una secuencia de escape? En realidad, noté que este problema no ocurre en una nueva ventana de terminal, sino que se reproduce después de hacer algo , así que intentaré identificarlo.
osyoyu
-2

Encontré esta pregunta tratando de resolver mi terminal que muestra "^ @" cuando se perdió el foco.

Leyendo las respuestas, intenté ir a las preferencias de iTerm2 -> Perfiles -> "Predeterminado" -> Sesión y desmarcar: "Cuando esté inactivo, envíe el código ASCII 0 cada 60 segundos"

Problema resuelto, espero que ayude a alguien

MauricioOtta
fuente