Geringe Verzögerung beim Umschalten der Modi in vim mit tmux oder screen

68

Das Umschalten in den und aus dem Einfügemodus in Vim erfolgt nicht mehr sofort, da ich tmux verwende. Nach dem Drücken von Escim Einfügemodus dauert es merklich lange, bis der Einfügemodus tatsächlich beendet ist. Nach dem Drücken Escund danach jeder anderen Taste wird sofort umgeschaltet und der Befehl für die danach gedrückte Taste Escausgeführt. Irgendeine Idee, was das verursachen könnte?

Die Vim-Konfiguration ist nicht das Problem, da die Verzögerung nicht auftritt, wenn ich Vim außerhalb von tmux ausführe. Dies hängt also wahrscheinlich irgendwie mit tmux zusammen. Ich benutze übrigens das Gnome-Terminal.

Ebenfalls erwähnenswert ist, dass ich anscheinend keine Tastenzuordnungen in tmux definieren kann Esc, mein Plan war es, zu binden Escan:

bind Escape send-keys ^[

EscLeider scheint es etwas zu binden, denn tmux funktioniert nicht. Das gleiche Problem tritt auch auf dem Bildschirm auf.

Ton van den Heuvel
quelle

Antworten:

122

Nach dem Durchstöbern der Manpages hat tmux eine Option dazu. Folgendes ~/.tmux.confbehebt das Verzögerungsproblem:

 set -sg escape-time 0

Sie müssen Ihren tmux-Server neu starten oder Ihre Konfiguration neu laden, damit dies wirksam wird. Dieses Problem tun source-file ~/.tmux.confvon der tmux prompt.

Ton van den Heuvel
quelle
2
Wo hast du das gefunden? Ich kann nirgends eine Fluchtzeit finden man tmux, und der Befehl funktioniert bei mir nicht.
djeikyb
Ich vermute, ist nur in der Entwicklungsversion verfügbar. Sie können es hier herunterladen
Ton van den Heuvel
4
Ich musste tmux kill-server verwenden, bevor diese Einstellung für mich funktionierte. Vielen Dank!
Sam
1
Das lässt mich wünschen, ich könnte Ihnen 10 positive Stimmen geben. Fand dies nach einer Stunde kämpfender Auszeiten in vim. Danke!
Malvim
1
@MichaelBrown, das tue ich auch und bin immer noch auf dieses Problem gestoßen. Dies sollte eigentlich keine Rolle spielen, da derselbe Schlüsselcode an den Terminalemulator gesendet wird, unabhängig davon, ob Sie die Escape-Taste oder ^ [drücken.
Ton van den Heuvel
4

Ich hatte ein anderes, aber ähnliches Problem, das ich zu lösen versuchte, als ich diese Seite fand. Deshalb werde ich das hier posten, falls es für andere hilfreich ist, die nach dieser Antwort suchen und diese Seite auf die gleiche Weise finden.

Problem: Der vi-Modus in der Bash hat eine Verzögerung, wenn vom Einfügemodus in den Befehlsmodus gewechselt wird

Lösung: Fügen Sie in Ihrer ~/.inputrcDatei hinzu, set keyseq-timeout nwo nein niedriger Wert größer als 0 ist. Der nStandardwert ist 500 ms. Dies ist der Grund für die Verzögerung. Siehe Dokumentation hier .

Wenn Sie wissen möchten, in welchem ​​Modus Sie sich befinden, schauen Sie sich Dylan Calis Bash-Fork an .

Kwas
quelle
das ist sehr hilfreich, ich habe es eingestellt 0.01und jetzt ist es erfreulicherweise viel schneller. Vielen Dank!
Es kann auch angehängt werden /etc/inputrc, um es allen Benutzern zur Verfügung zu stellen.
1

Es hört sich so an, als würden Sie ein Mapping verwenden, das mit beginnt ESC. Wenn Sie die ESCTaste drücken , muss vim warten, um festzustellen, ob der nächste Schlüssel derjenige im Mapping ist. Ist dies nicht der Fall, kann es sofort fortgesetzt werden.

Die vim-Konfiguration kann terminalabhängig sein, sodass die Tatsache, dass sie nicht außerhalb von tmux stattfindet, nicht viel bedeutet. Vim kann die $TERMUmgebungsvariable abfragen und je nach Wert eine andere Konfiguration auswählen.

Da gnome-terminal AFAIK xtermals Wert für die $TERMVariable verwendet und tmux verwendet screen, würde ich in all Ihren vim-Konfigurationsdateien nach Einstellungen suchen, die nur verwendet werden, wenn die $TERMVariable gleich ist screen. Ich vermute, dass eine vim-Konfigurationsdatei auf Ihrem System Zuordnungen für die Handhabung von Pfeiltasten (die mit dem ESCZeichen beginnen) festlegt, wenn sich das Terminal befindet screen.

Sie können dies testen, indem Sie die $TERMVariable in tmux vorübergehend ändern, bevor Sie vim starten. Wenn Ihre Shell bash ist, rufen Sie vim als auf

TERM=xterm vim

in tmux und sehen, ob das Problem weiterhin besteht. Sie sollten dies jedoch nicht als Fehlerbehebung verwenden, da es möglicherweise Unterschiede zwischen den Terminalfunktionen von tmux und xterm gibt und Sie möglicherweise auf einige Probleme stoßen.

Jan Hlavacek
quelle
Einige gute Hinweise hier. Ich benutze Bash, konnte TERM=xterm vimdas Problem aber leider nicht beheben. Ich muss etwas tiefer graben.
Ton van den Heuvel
1

Wie der Titel Screen erwähnt, ist hier die Lösung, um das Verhalten der Escape-Taste in GNU Screen zu korrigieren. (Von hier genommen .)

Hinzufügen

maptimeout 5

In der .screenrcConfig - Datei.

Twonky
quelle