Ctrl-s travar emulador de terminal?

311

Me deparei com uma frase no vimdoc:

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

e essa chave realmente pendura minha vim. Eu estava pensando que era culpa do vim, pois não havia nenhum problema ao usar o C-s/ C-x C-sno emacs nox. No entanto, agora mesmo quando eu estava lendo uma página de manual e pressionei o botão Ctrl-s, ele também trava man (estou definindo lesscomo PAGER).

Então, alguém pode me dizer o que está acontecendo?

Os emuladores de terminal são xterme lxterminal, e ttytambém têm esse problema. E um Ctrl+ qcoloca o processo novamente em todos os casos.

Hongxu Chen
fonte
6
Esta pode ser uma pergunta estúpida, mas você não mencionou o que tentou na sua pergunta. Você tentou C-qreativar a rolagem, certo?
H3rrmiller
3
@ h3rrmiller sim, está certo. Mas eu gostaria de saber por ctrl-sque o processo travou.
Hongxu Chen
antes havia teclados com a tecla de trava de rolagem C-se C-qos velhos tempos "alternavam com trava de rolagem". você pode desativar essa funcionalidade através da adição stty ixanye stty ixoff -ixonà sua.bashrc
h3rrmiller
2
Hoje é um cenário histórico estúpido nos emuladores de terminal; consulte esta pergunta relacionada para saber como consertar seu terminal.
Ingo Karkat
1
@IngoKarkat Eu não diria que é estúpido ... Eu ainda usá-lo de vez em quando
h3rrmiller

Respostas:

361

Esse recurso é chamado de Controle de fluxo de software (controle de fluxo XON / XOFF)

Quando uma extremidade do link de dados (neste caso, o emulador de terminal) não pode receber mais dados (porque o buffer está cheio ou quase cheio ou o usuário envia C-s), ele envia um "XOFF" para informar o final do envio. link de dados para pausar até que o sinal "XON" seja recebido.

O que está acontecendo nos bastidores é que o "XOFF" está dizendo ao driver TTY no kernel para colocar o processo que está enviando dados em um estado de suspensão (como pausar um filme) até que o driver TTY receba um "XON" para informar ao kernel para retomar o processo como se nunca tivesse sido parado.

C-sativa o bloqueio de rolagem do terminal. O que impede o seu terminal de rolar (enviando um sinal "XOFF" para pausar a saída do software).

C-qdesativa o bloqueio de rolagem. Reiniciando a rolagem do terminal (Enviando um sinal "XON" para retomar a saída do software).

Esse recurso é herdado (quando os terminais eram muito lentos e não permitiam rolagem) e é ativado por padrão.

Para desativar esse recurso é necessário o seguinte em qualquer ~/.bash_profileou ~/.bashrc:

stty -ixon
h3rrmiller
fonte
10
Na verdade, acho que remonta aos anos 70, se não aos anos 60.
21413 Keith
No entanto, parece não funcionar no Ubuntu 16.04.
Robert
3
"stty -ixon" <----- essa é uma das coisas mais importantes que li na internet na última semana. obrigado.
Brad P.
Na verdade, a história disso começa várias décadas antes dos anos 80. Veja O TTY desmistificado .
RoboAlex
25

No final do meu .bashrcscript, eu adicionei:

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