«^ [[O» et «^ [[I» apparaissent sur iTerm2 lorsque la mise au point est perdue

23

J'utilise iTerm2 2.1.1 sur Yosemite. Pas de tmux.

Lorsque iTerm perd le focus (lorsqu'il est basculé vers une autre application par Cmd-Tab ou en cliquant sur une autre fenêtre), un ^[[Iet ^[[Osemble être envoyé au terminal. Cela fait ^[[I^[[Oapparaître un, ou plus frustrant, dans Vim, cette combinaison ouvre un autre petit tampon.

Exemple: appuyer plusieurs fois sur Cmd-Tab après le démarrage cat

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

Cela ne se produit que sur iTerm et non sur Terminal.app. En outre, il se reproduit sur bash ou sh, il ne semble donc pas être un problème zsh. Certains googleurs ont suggéré qu'il s'agissait d'un problème de «concentration», mais qu'est-ce que la «concentration» dans le sens d'un terminal, et existe-t-il un moyen de désactiver ou d'éviter cela?

osyoyu
la source
Cela semble se reproduire lorsque j'écris en japonais (dans Vim), mais je ne sais toujours pas quelle action en est la cause ...
osyoyu

Réponses:

25

Selon ceci :

Ajout de la prise en charge des rapports perdus / gagnés. esc [? 1004h l'allume; puis le terminal envoie esc [I lors de la mise au point, esc [O lors de la mise au point. Envoyez esc [? 1004l pour désactiver.

Cmd- Rréinitialiser désactivera les rapports de focus (grâce à cela )

Yichuan Wang
la source
1
Cmd-Rest la séquence magique pour moi
bruceg
Très utile, merci. Cela m'a pris beaucoup de temps pour trouver si SEO ce Google: mac iterm iterm2 afficher le contenu du presse-papiers vim ex buffer focus
bsb
11

Je n'ai pas de Mac à portée de main pour tester cette réponse, mais je rencontre ce problème dans XTerm sous Linux très occasionnellement et (en supposant que iTerm2 respecte les mêmes codes de contrôle), vous pouvez trouver le correctif ci-dessous utile.

Exécutez la commande shell suivante à l'intérieur du terminal où vous voyez le problème:

printf "\e[?1004l"

(Notez que le dernier caractère est un «ell» en minuscule.)

Cette séquence de contrôle ANSI est similaire à celle répertoriée dans la réponse de Thomas Dickey, mais elle désactive la fonction (plutôt que la réactiver). Il devrait résoudre votre problème dans toutes les applications, pas seulement Vim, en empêchant les personnages de se produire.


Sous Linux, je peux démontrer cette séquence de contrôle en utilisant les étapes suivantes:

  • Exécutez xtermet activez la fonctionnalité en l'exécutant printf "\e[?1004h".
  • Exécutez xeyesou une autre application graphique à partir de ce même XTerm . (Pour une raison quelconque, cet effet ne se produit pas jusqu'à ce que l'XTerm en question lance une application. Quelqu'un sait pourquoi?)
  • Basculez à plusieurs reprises le focus dans et hors de l'XTerm d'origine (par exemple en cliquant sur les fenêtres) et voyez ^[[Oet ^[[Iêtre "tapé" dans l'XTerm d'origine.
  • Fermez maintenant Xeyes, revenez à l'XTerm d'origine et exécutez printf "\e[?1004l"(pour désactiver la fonction, comme décrit dans le correctif ci-dessus).
  • Répétez les étapes « exécuter xeyes, changer de focus » ci-dessus, mais cette fois, aucun caractère n'est entré dans le terminal.

Personnellement, je ne vois ce problème que si j'ai vidé par inadvertance la sortie binaire vers le terminal, mais si vous le rencontrez plus régulièrement, vous voudrez peut-être l'ajouter printfau script de démarrage interactif de votre shell (par exemple ~/.bashrc). Il ne semble pas y avoir de mal (sous XTerm au moins) à envoyer le code de contrôle si la fonctionnalité est déjà désactivée, donc cela devrait être sûr même si vous ne voyez que ce problème parfois.

Si vous êtes préoccupé par le fait que votre shell génère toujours cette sortie, peut-être parce que vous l'utilisez parfois dans des endroits qui ne gèrent pas bien ces codes de contrôle, ou si le problème est parfois déclenché après le démarrage du shell, alors vous préférerez peut-être définir un alias (par exemple avec alias focusfix='printf "\e[?1004l"') pour le rendre plus pratique à exécuter manuellement.

Paul Whittaker
la source
J'utilise Manjaro linux, Gnome, terminator et oh-my-zsh. Ce problème m'arrivait et cette réponse m'a beaucoup aidé.
Fabio Montefuscolo
2

Le terme « concentration » fait référence à laquelle terminal (ou fenêtre) est en cours d' acceptation clavier et des événements d' entrée de souris. Un seul peut avoir le focus; il existe des protocoles pour établir comment gagner et perdre le focus dans un environnement graphique qu'il ne serait pas utile d'explorer.

D'après la description (voir également l'indicateur du volet actuel de Tmux lorsque le focus est rétabli), il apparaît que iTerm2 implémente cette xtermfonctionnalité:

FocusIn / FocusOut

FocusIn / FocusOut peut être combiné avec n'importe quel événement de souris car il utilise un protocole différent. Lorsqu'il est défini, il entraîne xterm à envoyer CSI I lorsque le terminal gagne le focus et CSI O lorsqu'il perd le focus.

Il est activé par le mode privé 1004 (ajouté à xterm en 2007, patch # 224 ):

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

et peut être lié à ce correctif: Vim - Ajout de la prise en charge du mode de rapport de mise au point (DECSET / DECRST 1004) fonctionne sur les terminaux compatibles xterm , ce qui équivaut à tous les comportements des fonctionnalités de la souris "xterm" dans un seul paramètre:

/ * Le rapport Focus est pris en charge par les terminaux compatibles xterm et tmux. * /

Donc ... vous pouvez désactiver cela en disant à vim que votre terminal n'utilise pas le protocole de la souris xterm. Le patch cité indique à vim d'activer la fonctionnalité FocusIn / FocusOut (qui devrait normalement être désactivée), et s'il y a un défaut dans sa logique, peut laisser la fonctionnalité activée après avoir quitté vim.

Bien que vim soit la cause la plus probable de l'activation du mode, il est possible qu'un autre programme (ou script) l'active. Comme suggéré dans une autre réponse, vous pouvez réduire cela en collectant la sortie vers votre terminal à l'aide du scriptprogramme (production d'un typescriptfichier). Analyse qui peut prendre beaucoup de temps (et comme ce site ne semble pas prendre en charge les pièces jointes , il ne semble pas approprié de solliciter une discussion détaillée). J'utilise généralement unmappour transformer des fichiers dactylographiés en forme lisible à cet effet.

Thomas Dickey
la source
Merci pour votre réponse détaillée. Dire à Vim d'ignorer \e\[Oet de \e\[Irésoudre ce problème dans Vim, mais pas dans d'autres applications comme cat ou in rails server(peut-être des programmes utilisant readline?).
osyoyu
Alors ... quelqu'un pourrait-il dire exactement comment "dire à Vim d'ignorer \ e [O et \ e [I"?
Libin Wen
0

Pour résoudre ce problème, vous devez savoir quel programme active le mode de rapport de focus. Vous devez prendre un journal enregistré par la commande script (1) .

Hayaki Saito
la source
Focus Reporting est-il une fonctionnalité désactivée par défaut et activée par une séquence d'échappement? En fait, j'ai remarqué que ce problème ne se produit pas sur une nouvelle fenêtre de terminal, mais se reproduit après avoir fait quelque chose , je vais donc essayer de l'identifier.
osyoyu
-2

J'ai trouvé cette question en essayant de résoudre mon terminal affichant "^ @" lorsque le focus était perdu.

En lisant les réponses, j'ai essayé d'aller dans les préférences iTerm2 -> Profils -> "Par défaut" -> Session et décocher: "En cas d'inactivité, envoyer le code ASCII 0 toutes les 60 secondes"

Problème résolu, j'espère que cela aide quelqu'un

MauricioOtta
la source