“^ [[O” und “^ [[I” erscheinen auf iTerm2, wenn der Fokus verloren geht

23

Ich benutze iTerm2 2.1.1 auf Yosemite. Kein tmux.

Wenn iTerm den Fokus verliert (wenn Sie mit Cmd-Tab zu einer anderen Anwendung wechseln oder auf ein anderes Fenster klicken), wird anscheinend ein ^[[Iund ^[[Oan das Terminal gesendet. Dies führt ^[[I^[[Odazu, dass in Vim ein oder mehr frustrierend erscheint. Diese Kombination öffnet einen weiteren kleinen Puffer.

Beispiel: Drücken Sie nach dem Start mehrmals die Befehlstaste cat

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

Dies geschieht nur auf iTerm und nicht auf Terminal.app. Es reproduziert sich auch auf bash oder sh, so dass es kein zsh-Problem zu sein scheint. Einige Googler schlugen vor, dass dies ein „Fokus“ -Problem ist, aber was bedeutet „Fokus“ in der Bedeutung eines Terminals, und gibt es eine Möglichkeit, dies zu deaktivieren oder zu vermeiden?

osyoyu
quelle
Dies scheint sich zu reproduzieren, wenn ich Japanisch schreibe (in Vim), aber ich bin mir immer noch nicht sicher, welche Aktion die Ursache ist ...
osyoyu

Antworten:

25

Nach dieser :

Unterstützung für das Melden von Fokusverlusten / -verlusten hinzugefügt. esc [? 1004h schaltet es ein; dann sendet das Terminal esc [I beim Fokussieren, esc [O beim Entfokussieren. Sende esc [? 1004l zum Deaktivieren.

Cmd- RZum Zurücksetzen wird die Fokus-Berichterstellung deaktiviert (Dank dieser )

Yichuan Wang
quelle
1
Cmd-Rist die magische Sequenz für mich
bruceg
Also hilfreich, danke. Es hat lange gedauert, bis ich SEO für dieses Google gefunden habe: mac iterm iterm2 Inhalt der Zwischenablage anzeigen vim ex buffer focus
bsb
11

Ich habe keinen Mac zur Hand, um diese Antwort zu testen, aber ich stoße gelegentlich auf dieses Problem in XTerm unter Linux, und (vorausgesetzt, iTerm2 respektiert die gleichen Steuercodes), finden Sie die unten stehende Lösung möglicherweise hilfreich.

Führen Sie den folgenden Shell-Befehl im Terminal aus, in dem das Problem auftritt:

printf "\e[?1004l"

(Beachten Sie, dass das letzte Zeichen eine 'ell' in Kleinbuchstaben ist.)

Diese ANSI-Steuersequenz entspricht der in Thomas Dickeys Antwort aufgeführten, schaltet jedoch die Funktion aus (und nicht ein). Es sollte Ihr Problem in allen Anwendungen lösen, nicht nur in Vim, indem verhindert wird, dass die Zeichen überhaupt vorkommen.


Unter Linux kann ich diese Steuerungssequenz anhand der folgenden Schritte demonstrieren:

  • Führen Sie xtermdie Funktion aus und aktivieren Sie sie, indem Sie sie ausführen printf "\e[?1004h".
  • Führen Sie xeyeseine andere GUI-Anwendung von demselben XTerm aus . (Aus irgendeinem Grund tritt dieser Effekt bei mir erst auf, wenn der betreffende XTerm eine Anwendung startet. Weiß jemand, warum?)
  • Wechseln Sie wiederholt den Fokus in das ursprüngliche XTerm hinein und aus ihm heraus (z. B. durch Klicken auf Fenster) und sehen Sie, ^[[Owie ^[[Idas ursprüngliche XTerm "eingetippt" wird.
  • Schließen Sie nun Xeyes, kehren Sie zum ursprünglichen XTerm zurück und führen Sie es aus printf "\e[?1004l"(um die Funktion zu deaktivieren, wie im obigen Fix beschrieben).
  • Wiederholen Sie die obigen Schritte " Ausführen xeyes, Fokus wechseln ", diesmal werden jedoch keine Zeichen in das Terminal eingegeben.

Ich persönlich sehe dieses Problem nur, wenn ich versehentlich Binärausgaben auf das Terminal kopiert habe. Wenn Sie jedoch häufiger darauf stoßen, möchten Sie diese möglicherweise zum printfinteraktiven Startskript Ihrer Shell hinzufügen (z ~/.bashrc. B. ). Das Senden des Steuercodes scheint (zumindest unter XTerm) nicht zu schaden, wenn die Funktion bereits deaktiviert ist. Daher sollte es sicher sein, auch wenn dieses Problem nur gelegentlich auftritt.

Wenn Sie befürchten, dass Ihre Shell immer diese Ausgabe generiert, weil Sie sie manchmal an Orten verwenden, die mit diesen Steuercodes nicht gut umgehen, oder wenn das Problem manchmal nach dem Starten der Shell ausgelöst wird, ziehen Sie es möglicherweise vor, diese festzulegen Richten Sie einen Alias ​​(z. B. mit alias focusfix='printf "\e[?1004l"') ein, um die manuelle Ausführung zu vereinfachen.

Paul Whittaker
quelle
Ich verwende Manjaro Linux, Gnome, Terminator und oh-my-zsh. Dieses Problem ist mir passiert und diese Antwort hat mir sehr geholfen.
Fabio Montefuscolo
2

Der Begriff "Fokus" bezieht sich darauf, welches Terminal (oder Fenster) aktuell Tastatur- und Mauseingabeereignisse akzeptiert. Nur einer kann Fokus haben; Es gibt Protokolle, mit denen festgelegt werden kann, wie der Fokus in einer grafischen Umgebung gewonnen und verloren werden kann, deren Erkundung nicht hilfreich wäre.

Aus der Beschreibung (siehe auch Tmux-Anzeige für das aktuelle Fenster, wenn der Fokus wieder hergestellt ist ) geht hervor, dass iTerm2 diese xtermFunktion implementiert :

FocusIn / FocusOut

FocusIn / FocusOut kann mit jedem Mausereignis kombiniert werden, da ein anderes Protokoll verwendet wird. Bei dieser Einstellung sendet xterm CSI I, wenn das Terminal den Fokus erhält, und CSI O, wenn es den Fokus verliert.

Es wird im privaten Modus 1004 aktiviert (hinzugefügt zu xterm in 2007, Patch Nr. 224 ):

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

und möglicherweise im Zusammenhang mit diesem Patch: Vim - Unterstützung für Fokusberichterstellungsmodus hinzufügen (DECSET / DECRST 1004) funktioniert auf xterm-kompatiblen Terminals , wodurch das gesamte Verhalten von "xterm" -Mausfunktionen in einer Einstellung gleichgesetzt wird :

/ * Focus Reporting wird von xterm-kompatiblen Terminals und tmux unterstützt. * /

Sie können dies deaktivieren , indem Sie vim mitteilen, dass Ihr Terminal das xterm mouse-Protokoll nicht verwendet. Der angegebene Patch weist vim an, die FocusIn / FocusOut-Funktion (die normalerweise deaktiviert sein sollte) zu aktivieren. Wenn die Logik fehlerhaft ist, wird die Funktion möglicherweise nach dem Beenden von vim aktiviert.

Obwohl vim die wahrscheinlichste Ursache für die Aktivierung des Modus ist, ist es möglich, dass ein anderes Programm (oder Skript) diesen aktiviert. Wie in einer anderen Antwort vorgeschlagen, können Sie dies eingrenzen, indem Sie die Ausgabe mit dem scriptProgramm auf Ihrem Terminal sammeln (eine typescriptDatei erstellen). Das Analysieren kann zeitaufwändig sein (und da diese Site keine Anhänge zu unterstützen scheint, scheint es nicht geeignet zu sein, um eine ausführliche Diskussion anzufordern). Im Allgemeinen unmapverwandle ich zu diesem Zweck Typoskriptdateien in lesbare Form.

Thomas Dickey
quelle
Danke für deine ausführliche Antwort. Fordert Vim auf, dieses Problem in Vim zu ignorieren \e\[Ound zu \e\[Ibeheben, jedoch nicht in anderen Anwendungen wie cat oder in rails server(möglicherweise Programmen, die readline verwenden?).
Osyoyu
Also ... könnte jemand sagen, wie genau "Vim angewiesen wird, \ e [O und \ e [I] zu ignorieren"?
Libin Wen
0

Um dieses Problem zu lösen, müssen Sie wissen, welches Programm den Fokusberichtsmodus aktiviert. Sie sollten ein Protokoll erstellen, das mit dem Befehl script (1) aufgezeichnet wurde .

Hayaki Saito
quelle
Ist Focus Reporting eine Funktion, die standardmäßig deaktiviert und durch eine Escape-Sequenz aktiviert ist? Eigentlich ist mir aufgefallen, dass dieses Problem nicht in einem neuen Terminalfenster auftritt, sondern nach einer Aktion reproduziert wird. Deshalb werde ich versuchen, es zu identifizieren.
Osyoyu
-2

Ich habe diese Frage gefunden, indem ich versucht habe, mein Terminal zu lösen, in dem "^ @" angezeigt wird, wenn der Fokus verloren gegangen ist.

Nachdem ich die Antworten durchgesehen hatte, ging ich zu den iTerm2-Einstellungen -> Profile -> "Standard" -> Sitzung und deaktivierte das Kontrollkästchen: "Senden Sie im Leerlauf alle 60 Sekunden den ASCII-Code 0".

Problem gelöst, hoffe es hilft jemandem

MauricioOtta
quelle