Jak odblokować po przypadkowym naciśnięciu Ctrl-S w terminalu?

729

Jest to sytuacja, która zdarza mi się dość często: po naciśnięciu (z innym zamiarem) Ctrl-Sw terminalu interakcja (wejście lub wyjście) z nim zostaje zamrożona. Prawdopodobnie jest to rodzaj „blokady przewijania” lub cokolwiek innego.

Jak potem odblokować terminal?

(Tym razem pracowałem z apt-shellwnętrzem bashwewnątrz urxvt- nie jestem pewien, która z nich jest odpowiedzialna za specjalną obsługę Ctrl-S: Przeszukiwałem historię poleceń wstecz C-r, jak zwykle dla readline, ale potem chciałem wrócić „wstecz” "przesuwa historię przez zwykłe - przynajmniej w Emacsie - C-s( 1 , 2 , 3 ), ale to spowodowało zamrożenie terminala. Cóż, przewijanie / stronicowanie, aby zobaczyć przeszłość, nadal działa w terminalu, ale nie ma interakcji z uruchomionymi tam procesami).

imz - Ivan Zakharyaschev
źródło
23
Pracowałem vimi nacisnąłem Ctrl-S, aby zapisać zmiany. Uh-ohXD
ADTC
4
Dlaczego to w ogóle istnieje?
neverMind9,

Odpowiedzi:

862

Ctrl-Q

Aby całkowicie to wyłączyć, stty -ixonwklej skrypt startowy. Aby zezwolić dowolnemu kluczowi na przywrócenie spraw, użyj stty ixany.

ps: To nie jest terminal ani powłoka, ale robi to sterownik terminala systemu operacyjnego.

ak2
źródło
8
Dziękuję Ci! BTW, tam zasugerowali Ctrl-C; czy to też działa? (A w innym miejscu , Ctrl-Qtak jak ty, zasugerowali .)
imz - Iwan Zachariaszew
23
Ctrl-C działa, ale wysyła również sygnał przerwania, którego na ogół nie chciałby. (Btw, klucze używane do tych rzeczy można konfigurować poprzez stty.)
ak2
2
Pamiętam, jak wypróbowałem tę kombinację na moim Apple] [klon, i ona też tam działała - Ctrl-Sa następnie Ctrl-Qwznowiła.
sashoalm
19
DZIĘKI BOGU !! To mnie od lat nęka. Nie jestem pewien, dlaczego VIM po prostu nie zaimplementował tego jako natywnego skrótu do zapisywania zamiast cokolwiek to robi. Dobrze wiedzieć, że istnieje ucieczka z więzienia, którym jest zamrożony ekran VIM z powodu naturalnego użycia CTRL + S (zapisz skrót), który ma zastosowanie w prawie wszystkich aplikacjach Z WYJĄTKIEM VIM.
Kraang Prime
8
@SanuelJackson Ctrl-S „Zapisz skrót” ma zastosowanie do prawie wszystkich aplikacji DESKTOP Z WYJĄTKIEM vim. I z wyjątkiem Emacsa. I Nano. I każdą inną „aplikację”, którą można uruchomić na terminalu, właśnie dlatego, że jest już używany przez terminal do kontroli przepływu. Jest to ten sam powód, dla którego nie można znaleźć aplikacji Linux Desktop przy użyciu skrótów Ctrl-Alt-FN: ponieważ są one już używane przez system.
gerlos
384

Ctrl- Qjest rzeczywiście odpowiedzią. Pomyślałem, że wrzucę krótką historię tego, która jest zbyt długa, aby zmieścić się w marginesie poprawnej odpowiedzi ak2 .

W średniowieczu terminal był dużym urządzeniem, które podłączało się do zdalnego urządzenia (pierwotnie innego terminala, ponieważ telegrafy były o wiele łatwiejsze do nauczenia się obsługi niż klucz telegraficzny) za pomocą długiego drutu lub linii telefonicznych z modemami. Do czasu, kiedy Unix się rozwijał, kod ASCII był już dobrze ugruntowany (chociaż konkurencyjny kod EBCDIC od IBM wciąż był siłą, z którą należy się liczyć).

Najwcześniejsze terminale prowadziły drukowany zapis każdej otrzymanej postaci. Tak długo, jak znaki przybywają nie szybciej niż głowica drukująca może je wpisać. Ale gdy tylko możliwe były terminale oparte na CRT, pojawił się problem, że tylko około 25 linii mieści się w CRT, a 25 linii 80 znaków reprezentuje wystarczającą ilość pamięci RAM, że nikt nie myślał poważnie o zapewnieniu większej ilości pamięci RAM dla znaków, które przewinęły się z góry ekran.

Potrzebna była więc pewna konwencja, aby zasygnalizować, że koniec wysyłający powinien zatrzymać się, aby czytelnik mógł nadrobić zaległości.

7-bitowy kod ASCII ma 33 punkty kodowe przeznaczone na znaki kontrolne (od 0 do 31 i 127). Niektóre z nich miały naprawdę dobrze określone cele, takie jak NUL(puste lidera Taśma papierowa do gwintowania, luk i spawów), DEL( „przekreślonego” znaki na taśmie papierowej wskazane przez wbicie wszystkich siedmiu otworów), BEL(ding!) CR, LFOraz TAB. Jednak cztery zostały wyraźnie zdefiniowane dla sterowania urządzeniem terminala sam ( DC1dla DC4aka Ctrl + Q Ctrl-R, Ctrl + S i CTRL + T).

Moje przypuszczenie jest takie, że jakiś inżynier pomyślał, że (jak idą mnemoniki), „S” dla „Stop” i „Q” dla „Kontynuuj” nie były takie złe i przypisane DC3do oznaczenia „proszę przestać wysyłać” i DC1oznaczenia „ok , kontynuuj wysyłanie teraz ”.

Nawet ta konwencja była już dobrze ustalona, ​​zanim Unix opuszczał gniazdo w Bell Labs, aby wyjść na świat.

Konwencja znana jest jako oprogramowanie do kontroli przepływu i jest niezwykle powszechna w rzeczywistych urządzeniach szeregowych. Nie jest łatwo wdrożyć poprawnie, ponieważ uniemożliwia użycie któregokolwiek z tych znaków w jakimkolwiek innym celu w kanale komunikacyjnym, a sygnał Stop musi być obsługiwany przed wszystkimi oczekującymi odebranymi znakami, aby uniknąć wysyłania więcej niż koniec odbierający może uchwyt.

Jeśli jest to praktyczne, zdecydowanie zaleca się stosowanie dodatkowych sygnałów poza pasmem z szeregowego strumienia danych do kontroli przepływu. W przypadku połączeń bezpośrednio okablowanych, na które można pozwolić sobie na dodatkowe przewody sygnałowe, znajdziesz używany sprzętowy uścisk dłoni, który uwalnia te znaki do innych zastosowań.

Oczywiście dzisiejsze okno terminala nie korzysta z rzeczywistego fizycznego portu szeregowego, ma paski przewijania i tak naprawdę wcale nie wymaga uzgadniania oprogramowania. Ale konwencja trwa.

Przypominam sobie twierdzenie, że Richard Stallman otrzymał skargi dotyczące mapowania Ctrl + S na przyrostowe wyszukiwanie w pierwszych wydaniach emacsa i że był raczej niesympatyczny dla każdego użytkownika, który musiał polegać na 7-bitowym, sterowanym przepływem oprogramowania połączeniu.

RBerteig
źródło
2
Dziękuję .. bardzo interesujące ... Zastanawiam się: dlaczego, u licha, ktoś miałby kontynuować proces z „Q”, który jest powszechnie używany (teraz) w Quit… Grupowanie QRST wyjaśnia to…
Peter.O
13
Dziękuję bardzo za ten kawałek historii. Niedawno wyłączyłem domyślnie kontrolę przepływu w emulatorze terminali, który utrzymuję, ale musiałem ją przywrócić dość szybko po protestach wokalnych tradycjonalistów uniksowych, którzy nadal z niej korzystają. Zamiast tego ustawiłem bit ixany, aby przynajmniej ludzie, którzy naciskają ^ S bez wiedzy o ^ Q, nie utknęli.
ak2
3
@RBerteig Natknąłem się na coś podobnego do nauki o backspace i usuwaniu. Backspace jest oficjalnie ^ H, a usunięcie to ^? Niektórzy ludzie, tacy jak programiści Emacsa (znowu Stallman?), Chcieli, aby ^ H był dostępny do celów ogólnych, takich jak skróty takie jak Pomoc. Sekwencja ucieczki ^ [[3 ~ czy coś takiego stworzono, aby zastąpić ^? a backspace stał się teraz starym znakiem usuwania ^ ?. W rzeczywistości widziałem ncurses specjalnie załatanych na dystrybucjach Linuksa, aby zamapować te klucze w terminfo, podczas gdy ncurses na FreeBSD nie jest ładowany, powodując pewne irytujące zamieszanie powodujące, że backspace nie działa.
penguin359
23
Zastanawiałem się, dlaczego DEL miał kod 127, zamiast być zgrupowane z innymi znakami kontrolnymi, dopóki nie grałem z taśmą papierową i ASR33. Kiedy zdałem sobie sprawę, że ma efekt wybijania wszystkich dziur, co oznaczało, że można go było zablokować dowolną wcześniej uderzaną postacią, aby go usunąć, miało to sens.
RBerteig
3
@SanuelJackson Minęło trochę czasu, odkąd przyjrzałem się uważnie, ale domyślny vimrc, który jest dostarczany z systemem Windows, mapował <Cs> na „: update” przez wiele lat. Jestem również całkiem pewien, że widziałem to na niektórych dystrybucjach gvima w przeszłości. Jeśli używasz vima w terminalu, ta historia jest nadal bardzo istotna. Nowoczesne emulatory terminali nadal implementują klucze kontroli przepływu, więc nawet jeśli vim je zmapował, nigdy ich nie zobaczy, chyba że każdy użytkownik zrobi wszystko, aby wyłączyć kontrolę przepływu, jak opisano w zaakceptowanej odpowiedzi.
Drew