Emulator Ctrl-s hang terminal?

311

Natknąłem się na zdanie w vimdoc:

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

i ten klucz rzeczywiście zawiesza mój vim. Myślałem, że to wina vima, ponieważ nie miałem problemu z użyciem C-s/ C-x C-sin emacs nox. Jednak właśnie teraz, kiedy czytałem stronę podręcznika i naciskałem Ctrl-s, ona również się zawiesza man (ustawiam się lessjako PAGER).

Czy ktoś może mi powiedzieć, co się dzieje?

Te emulatory terminali są xtermi lxterminal, i ttyma również ten problem. A Ctrl+ ponownie qustawia proces we wszystkich przypadkach.

Hongxu Chen
źródło
6
To może być głupie pytanie, ale nie wspomniałeś o tym, co próbowałeś w swoim pytaniu. Próbowałeś C-qponownie włączyć przewijanie, prawda?
h3rrmiller
3
@ h3rrmiller tak, zgadza się. Chciałbym tylko wiedzieć, dlaczego ctrl-sproces się zawiesił.
Hongxu Chen,
wcześniej istniały klawiatury z klawiszem blokady przewijania, C-sa C-qdawniej „przełączanie blokady przewijania”. możesz wyłączyć tę funkcję, dodając stty ixanyi stty ixoff -ixondo swojego.bashrc
h3rrmiller
2
Jest to obecnie głupie ustawienie historyczne emulatorów terminalnych; zobacz to powiązane pytanie, aby dowiedzieć się, jak naprawić terminal.
Ingo Karkat
1
@IngoKarkat Nie powiedziałbym, że to głupie ... Nadal go używam od czasu do czasu
h3rrmiller

Odpowiedzi:

361

Ta funkcja nosi nazwę Software Flow Control (kontrola przepływu XON / XOFF)

Gdy jeden koniec łącza danych (w tym przypadku emulator terminala) nie może odebrać więcej danych (ponieważ bufor jest pełny lub prawie pełny lub użytkownik wysyła C-s), wyśle ​​„XOFF”, aby poinformować koniec wysyłania łącze danych, aby wstrzymać do momentu otrzymania sygnału „XON”.

To, co dzieje się pod maską, polega na tym, że „XOFF” mówi sterownikowi TTY w jądrze, aby wprowadził proces, który wysyła dane do stanu uśpienia (jak wstrzymywanie filmu), dopóki sterownik TTY nie zostanie wysłany „XON”, aby poinformować jądro, aby wznowić proces tak, jakby nigdy nie został zatrzymany.

C-swłącza blokadę przewijania terminala. Zapobiega to przewijaniu się terminala (wysyłając sygnał „XOFF”, aby wstrzymać wyjście oprogramowania).

C-qwyłącza blokadę przewijania. Wznawianie przewijania terminala (wysyłając sygnał „XON” w celu wznowienia działania oprogramowania).

Ta funkcja jest starsza (wcześniej, gdy terminale działały bardzo wolno i nie pozwalały na przewijanie) i jest domyślnie włączona.

Aby wyłączyć tę funkcję, niezbędne są w jeden ~/.bash_profilelub ~/.bashrc:

stty -ixon
h3rrmiller
źródło
10
Właściwie myślę, że w końcu sięga lat 70., jeśli nie lat 60.
Keith
Wydaje się jednak, że nie działa na Ubuntu 16.04.
Robert,
3
„stty -ixon” <----- to jedna z najważniejszych rzeczy, które przeczytałem w Internecie w ostatnim tygodniu. Dziękuję Ci.
Brad P.
W rzeczywistości historia tego zaczyna się kilkadziesiąt lat wcześniej niż lata 80-te. Zobacz sekcję TTY odszyfrowaną .
RoboAlex
25

Na końcu mojego .bashrcskryptu dodałem:

#so as not to be disturbed by Ctrl-S ctrl-Q in terminals:
stty -ixon
Stephane Rolland
źródło