Ctrl-S hängen Terminal-Emulator?

311

Ich bin auf einen Satz in vimdoc gestoßen:

Note: CTRL-S does not work on all terminals and might block
                further input, use CTRL-Q to get going again.

und dieser Schlüssel hängt in der Tat mein vim. Ich dachte, dass es die Schuld von vim war, da es kein Problem gab, wenn ich C-s/ C-x C-sin emacs nox verwende. Aber gerade, als ich eine Manpage las und auf drückte Ctrl-s, hängt sie man auch (ich setze lessals PAGER).

Kann mir jemand sagen, was passiert?

Die Terminalemulatoren sind xtermund lxterminalund haben ttyauch dieses Problem. Und ein Ctrl+ qbringt den Prozess in allen Fällen wieder in Ordnung.

Hongxu Chen
quelle
6
Dies mag eine dumme Frage sein, aber Sie haben nicht erwähnt, was Sie in Ihrer Frage versucht haben. Sie haben versucht C-q, das Scrollen wieder zu aktivieren, oder?
h3rrmiller
3
@ h3rrmiller ja, das stimmt. Aber ich möchte nur wissen, warum ctrl-sder Prozess hängen bleibt.
Hongxu Chen
davor gab es tastaturen mit scroll-lock-taste C-sund C-qdie alten tage waren "scroll lock toggle". Sie können diese Funktionalität deaktivieren, indem Sie stty ixanystty ixoff -ixon.bashrc
Folgendes
2
Dies ist heutzutage eine blöde historische Einstellung in Terminalemulatoren. In dieser Frage erfahren Sie, wie Sie Ihr Terminal reparieren können.
Ingo Karkat
1
@IngoKarkat Ich würde nicht sagen, dass es dumm ist ... Ich benutze es immer noch von Zeit zu Zeit
h3rrmiller

Antworten:

361

Diese Funktion wird als Software-Flusskontrolle (XON / XOFF-Flusskontrolle) bezeichnet.

Wenn ein Ende der Datenverbindung (in diesem Fall der Terminalemulator) keine Daten mehr empfangen kann (weil der Puffer voll oder fast voll ist oder der Benutzer sendet C-s), sendet er ein "XOFF", um das Ende des Sendens mitzuteilen Datenverbindung pausieren, bis das "XON" -Signal empfangen wird.

Was unter der Haube passiert, ist, dass das "XOFF" dem TTY-Treiber im Kernel anweist, den Prozess, der Daten sendet, in einen Ruhezustand zu versetzen (wie das Anhalten eines Films), bis dem TTY-Treiber ein "XON" gesendet wird, um dies mitzuteilen Kernel, um den Prozess fortzusetzen, als wäre er nie gestoppt worden.

C-sAktiviert die Terminal-Bildlaufsperre. Dies verhindert, dass Ihr Terminal rollt (durch Senden eines "XOFF" -Signals, um die Ausgabe der Software anzuhalten).

C-qDeaktiviert die Bildlaufsperre. Terminal-Bildlauf fortsetzen (durch Senden eines "XON" -Signals, um die Ausgabe der Software fortzusetzen).

Diese Funktion ist Legacy (damals, als Terminals sehr langsam waren und kein Scrollen zuließen) und standardmäßig aktiviert.

Um diese Funktion zu deaktivieren, benötigen Sie Folgendes in ~/.bash_profileoder ~/.bashrc:

stty -ixon
h3rrmiller
quelle
10
Eigentlich denke ich, dass es endlich so weit zurück geht wie in den 70ern, wenn nicht in den 60ern.
Keith
Es scheint jedoch nicht auf Ubuntu 16.04 zu funktionieren.
Robert
3
"stty -ixon" <----- das ist eines der wichtigsten Dinge, die ich in der letzten Woche im Internet gelesen habe. Dankeschön.
Brad P.
Tatsächlich beginnt die Geschichte dieses Phänomens mehrere Jahrzehnte früher als in den 80er Jahren. Siehe Der TTY entmystifiziert .
RoboAlex
25

Am Ende meines .bashrcSkripts habe ich hinzugefügt:

#so as not to be disturbed by Ctrl-S ctrl-Q in terminals:
stty -ixon
Stephane Rolland
quelle