Como descongelar depois de pressionar acidentalmente Ctrl-S em um terminal?

728

É uma situação que já aconteceu muitas vezes comigo: depois que eu pressiono (com uma intenção diferente) Ctrl-Sem um terminal, a interação (entrada ou saída) com ele é congelada. Provavelmente é uma espécie de "bloqueio de rolagem" ou o que quer.

Como descongelar o terminal depois disso?

(Desta vez, tenho vindo a trabalhar com apt-shelldentro de um bashinterior urxvt--não certeza de qual deles é responsável pelo manuseio especial de Ctrl-S: eu estava pesquisando a história de comandos para trás com C-r, como de costume para readline, mas então eu queria ir "de volta "avança pela história com o habitual - pelo menos no Emacs-- C-s( 1 , 2 , 3 ), mas isso causou o congelamento do terminal. Bem, rolagem / paginação para ver as coisas passadas ainda funciona no terminal, mas nenhuma interação com os processos executados lá.)

imz - Ivan Zakharyaschev
fonte
23
Eu estava trabalhando vime pressionei Ctrl-S para salvar minhas edições. Uh-ohXD
ADTC
4
Por que isso existe em primeiro lugar?
neverMind9

Respostas:

861

Ctrl-Q

Para desabilitar isso completamente, insira stty -ixonum script de inicialização. Para permitir que qualquer tecla faça com que as coisas fluam novamente, use stty ixany.

ps: Não é o terminal nem o shell que faz isso, mas o driver do terminal do sistema operacional.

ak2
fonte
8
Obrigado! BTW, não sugeriu que eles Ctrl-C; também funciona? (E em outro lugar , eles sugeriram Ctrl-Q, assim como você.)
IMZ - Ivan Zakharyaschev
23
Ctrl-C funciona, mas também envia um sinal de interrupção, o que geralmente não seria desejado. (Btw, as chaves sendo usado para essas coisas são todos configurável através stty.)
AK2
2
Lembro-me de experimentar essa combinação no meu Apple] [clone, e funcionou lá também - Ctrl-Se depois Ctrl-Qretomar.
sashoalm
19
GRAÇAS A DEUS !! Isso tem sido algo que me incomoda há anos. Não sei por que o VIM simplesmente não implementou isso como um atalho nativo para salvar, e não o que diabos ele faz. É bom saber que há uma fuga da prisão que é a tela congelada do VIM devido ao uso natural de CTRL + S (salvar atalho), aplicável em quase todas as aplicações, EXCETO VIM.
Kraang Prime
8
@SanuelJackson Ctrl-S "salvar atalho" é aplicável em quase todos os aplicativos DESKTOP EXCEPT vim. E exceto o Emacs. E Nano. E todas as outras "aplicações" que você pode executar em um terminal, exatamente porque ele já é usado pelo terminal para controle de fluxo. É o mesmo motivo para você não encontrar um aplicativo Linux Desktop usando os atalhos Ctrl-Alt-FN: porque eles já são usados ​​pelo sistema.
gerlos 23/09/2015
383

Ctrl- Qé de fato a resposta. Eu pensei em relatar um pouco dessa história que é muito longa para caber nas margens da resposta correta do ak2 .

Na era das trevas, um terminal era um grande equipamento conectado a um dispositivo remoto (originalmente outro terminal porque os teletipos eram muito mais fáceis de aprender a operar do que uma tecla telegráfica) por um fio longo ou por linhas telefônicas com modems. No momento em que o Unix estava desenvolvendo, o código ASCII já estava bem estabelecido (embora o código EBCDIC concorrente da IBM ainda fosse uma força a ser reconhecida).

Os primeiros terminais mantinham um registro impresso de todos os caracteres recebidos. Contanto que os caracteres não cheguem mais rápido do que a cabeça de impressão possa digitá-los, pelo menos. Mas assim que os terminais baseados em CRT foram possíveis, surgiu o problema de que apenas cerca de 25 linhas cabiam no CRT e 25 linhas de 80 caracteres representavam RAM suficiente para que ninguém pensasse seriamente em fornecer mais RAM para caracteres que rolavam do topo da tela. a tela.

Por isso, foi necessária alguma convenção para sinalizar que o final do envio deveria fazer uma pausa para permitir que o leitor o alcançasse.

O código ASCII de 7 bits possui 33 pontos de código dedicados ao controle de caracteres (0 a 31 e 127). Alguns dos que tinham propósitos muito bem estabelecidas, tais como NUL(líder fita de papel em branco para threading, lacunas, e emendas), DEL( "riscado" personagens na fita de papel indicados por socos todos os sete buracos), BEL(ding!), CR, LF, E TAB. Mas quatro foram definidos explicitamente para controlar o próprio dispositivo terminal ( DC1a DC4aka Ctrl + Q, Ctrl + R, S Ctrl + e Ctrl + T).

Meu melhor palpite é que algum engenheiro pensou que (conforme a mnemônica), "S" para "Parar" e "Q" para "Continuar" não fossem muito ruins e designados DC3para significar "por favor, pare de enviar" e DC1signifique "ok" , continue enviando agora ".

Até essa convenção já estava bem estabelecida quando o Unix estava deixando o ninho no Bell Labs para sair para o mundo.

A convenção é conhecida como controle de fluxo de software e é extremamente comum em dispositivos seriais reais. Não é fácil de implementar corretamente, pois impede o uso de qualquer um desses caracteres para qualquer outra finalidade no canal de comunicação, e o sinal de parada deve ser manipulado antes de qualquer caractere recebido pendente para evitar o envio de mais do que a extremidade receptora pode. lidar com.

Se possível, é amplamente preferido o uso de sinais adicionais fora da banda do fluxo de dados seriais para controle de fluxo. Nas conexões com fio diretamente que podem pagar os fios de sinal adicionais, você encontrará o handshake de hardware em uso, que libera esses caracteres para outros usos.

Obviamente, a janela do terminal de hoje não está usando uma porta serial física real, possui barras de rolagem e não precisa realmente de handshake de software. Mas a convenção persiste.

Lembro-me da alegação de que Richard Stallman recebeu reclamações sobre o mapeamento de Ctrl + S para pesquisa incremental nos primeiros lançamentos do emacs, e que ele era pouco simpático a qualquer usuário que tivesse que depender de uma conexão de fluxo de software de 7 bits.

RBerteig
fonte
2
Thanke .. muito interessante ... Eu me pergunto: por que diabos alguém escolheria Continuar um processo com "Q", que é comumente usado (agora) para Quit ... O agrupamento QRST explica isso .....
precisa saber é o seguinte
13
Muito obrigado por esse pouco de história. Recentemente, desativei o controle de fluxo por padrão em um emulador de terminal que mantenho, mas tive que restabelecê-lo rapidamente após protestos vocais de tradicionalistas do Unix que ainda o usam. Em vez disso, defino o bit ixany, para que pelo menos as pessoas que pressionam ^ S sem saberem ^ Q não fiquem presas.
AK2
3
@RBerteig Encontrei algo semelhante sobre backspace e delete. Backspace é oficialmente ^ H e delete é ^? Algumas pessoas como os desenvolvedores do Emacs (Stallman de novo?) Queriam ^ H disponíveis para uso geral, como atalhos como a Ajuda. A sequência de escape ^ [[3 ~ ou algo parecido foi criado para substituir ^? e o backspace agora se tornou o antigo caractere de exclusão ^ ?. De fato, eu vi ncurses especificamente corrigidas nas distros do Linux para remapear essas chaves no terminfo, enquanto ncurses no FreeBSD está sem patch, causando parte da confusão irritante que faz com que o backspace não funcione.
precisa saber é o seguinte
23
Eu me perguntava por que a DEL tinha o código 127 em vez de ser agrupada com os outros caracteres de controle, até tocar pela primeira vez com alguma fita de papel e um ASR33. Depois que percebi que ele tinha o efeito de perfurar todos os buracos, o que significava que poderia ser superado em qualquer personagem anteriormente perfurado para excluí-lo, isso fazia sentido.
RBerteig
3
@SanuelJackson Já faz algum tempo desde que olhei atentamente, mas o vimrc padrão que acompanha o Windows mapeia <Cs> para ": update" por muitos anos. Também tenho certeza de que já vi isso em algumas distros para o gvim no passado. Se você estiver usando o vim em um terminal, esse histórico ainda é muito relevante. Os emuladores de terminal modernos ainda implementam as teclas de controle de fluxo, portanto, mesmo que o vim as mapeasse, nunca as veria, a menos que cada usuário tentasse desativar o controle de fluxo, conforme descrito na resposta aceita.
Drew