Comment dégeler après avoir appuyé accidentellement sur Ctrl-S dans un terminal?

728

C'est une situation qui m'est souvent arrivée: après avoir appuyé (avec une intention différente) Ctrl-Sdans un terminal, l'interaction (entrée ou sortie) avec celui-ci est gelée. C'est probablement une sorte de "verrou de défilement" ou autre chose.

Comment puis-je dégeler le terminal après cela?

(Cette fois, j’ai travaillé avec apt-shellun contenu bashinterne - urxvtje ne sais pas lequel d’entre eux est responsable du traitement spécial de Ctrl-S: j’ai parcouru l’historique des commandes avec le sens inverse C-r, comme d'habitude pour readline, mais je voulais ensuite revenir "en arrière" "transmet l'historique avec l'habituel - du moins dans Emacs - C-s( 1 , 2 , 3 ), mais cela a provoqué le blocage du terminal. Le défilement / la pagination pour afficher les éléments passés fonctionne toujours dans le terminal, mais aucune interaction avec les processus exécutés là.)

imz - Ivan Zakharyaschev
la source
23
Je travaillais dans vimet j'ai appuyé sur Ctrl-S pour enregistrer mes modifications. Uh-ohXD
ADTC
4
Pourquoi cela existe-t-il en premier lieu?
neverMind9

Réponses:

861

Ctrl-Q

Pour le désactiver complètement, utilisez stty -ixonun script de démarrage. Pour permettre à n’importe quelle touche de faire bouger les choses, utilisez stty ixany.

ps: ce n'est ni le terminal ni le shell qui le fait, mais le pilote de terminal du système d'exploitation.

ak2
la source
8
Je vous remercie! BTW, ils ont suggéré Ctrl-C; ça marche aussi? (Et à un autre endroit , ils ont suggéré Ctrl-Q, tout comme vous.)
IMZ - Ivan Zakharyaschev
23
Ctrl-C fonctionne, mais il envoie également un signal d'interruption, ce que l'on ne voudrait généralement pas. (Btw, les touches utilisées pour ces choses sont toutes configurables via stty.)
ak2
2
Je me souviens d’avoir essayé cette combinaison sur mon clone Apple [], et cela a également fonctionné là-bas - Ctrl-Spuis Ctrl-Qde reprendre.
Sashoalm
19
DIEU MERCI !! Cela me tracasse depuis des années. Vous ne savez pas pourquoi VIM n'a tout simplement pas implémenté cela comme un raccourci natif pour enregistrer au lieu de quoi que ce soit d'autre. Il est bon de savoir que l’écran gelé du VIM permet de s’échapper de la prison en raison de l’utilisation naturelle de CTRL + S (raccourci d’enregistrement) qui est applicable dans presque toutes les applications SAUF VIM.
Kraang Prime
8
@SanuelJackson Ctrl-S "Enregistrer le raccourci" est applicable dans presque toutes les applications DESKTOP SAUF vim. Et sauf Emacs. Et Nano. Et toute autre "application" que vous pouvez exécuter sur un terminal, précisément parce qu’elle est déjà utilisée par le terminal pour le contrôle de flux. C'est la même raison pour laquelle vous ne trouverez pas d'application Linux Desktop à l'aide des raccourcis Ctrl-Alt-FN: car ils sont déjà utilisés par le système.
gerlos
383

Ctrl- Qest en effet la réponse. Je pensais avoir ajouté une petite histoire trop longue pour tenir dans les marges de la bonne réponse de ak2 .

À l’époque des ténèbres, un terminal était un gros équipement connecté à un périphérique distant (à l’origine, un autre terminal, car les télétypes étaient beaucoup plus faciles à apprendre qu’une clé de télégraphe) sur un long fil ou via des lignes téléphoniques avec modems. Au moment où Unix se développait, le code ASCII était déjà bien établi (bien que le code EBCDIC concurrent d’IBM fût toujours une force avec laquelle il fallait compter).

Les premiers terminaux gardaient un enregistrement imprimé de chaque caractère reçu. Tant que les caractères n'arrivent pas plus vite que la tête d'impression ne peut les saisir, au moins. Mais dès que les terminaux à tube cathodique ont été possibles, le problème est que seulement environ 25 lignes tiennent sur le tube cathodique, et que 25 lignes de 80 caractères représentent suffisamment de RAM pour que personne ne songe sérieusement à fournir plus de RAM aux personnages qui ont défilé du début à la fin. l'écran.

Il fallait donc une convention pour signaler que l’envoyeur devrait faire une pause pour permettre au lecteur de se rattraper.

Le code ASCII à 7 bits comporte 33 points de code consacrés aux caractères de contrôle (0 à 31 et 127). Certains d' entre eux avaient des fins très bien établies, comme NUL(chef blanc de bande de papier pour le filetage, les lacunes et les épissures), DEL( « barré » caractères sur une bande de papier indiqué par poinçonnage sept trous), BEL(ding!), CR, LFEt TAB. Mais quatre ont été définis de manière explicite pour commander le dispositif terminal lui - même ( DC1à DC4aka Ctrl + Q, Ctrl + R, S et Ctrl + Ctrl + T).

Ma meilleure hypothèse est que certains ingénieurs ont pensé que (comme le disent les mnémoniques), "S" pour "Stop" et "Q" pour "Continuer" n'étaient pas si mauvais, et assignés DC3à signifier "s'il vous plaît, arrêtez d'envoyer" et DC1à signifier "ok , continuez à envoyer maintenant ".

Même cette convention était déjà bien établie au moment où Unix quittait son nid chez Bell Labs pour aller dans le monde.

La convention est connue sous le nom de contrôle de flux logiciel et est extrêmement courante dans les périphériques série réels. Il n'est pas facile à mettre en œuvre correctement, car cela empêche l'utilisation de l'un de ces caractères à toute autre fin dans le canal de communication, et le signal d'arrêt doit être traité avant tout caractère reçu en attente pour éviter d'envoyer davantage que le destinataire ne peut en envoyer. manipuler.

Si possible, l’utilisation de signaux supplémentaires hors bande du flux de données série pour le contrôle de flux est grandement préférable. Sur les connexions directement câblées qui peuvent se permettre les câbles de signal supplémentaires, vous découvrirez que la liaison matérielle est utilisée, ce qui libère ces caractères pour d'autres utilisations.

Bien entendu, la fenêtre de terminal actuelle n’utilise pas de port série physique, elle est dotée de barres de défilement et n’a pas vraiment besoin d’une liaison logicielle. Mais la convention persiste.

Je me souviens de l'affirmation selon laquelle Richard Stallman aurait reçu des plaintes concernant sa correspondance entre Ctrl + S et la recherche incrémentielle dans les premières versions d'Emacs, et qu'il était plutôt antipathique envers tout utilisateur qui devait dépendre d'une connexion à 7 bits à contrôle de logiciel.

RBerteig
la source
2
Thanke .. très intéressant ... Je me demandais: pourquoi diable voudrait-on continuer le processus avec "Q" qui est couramment utilisé (maintenant) pour Quitter ... Le groupe QRST l'explique .....
Peter.O
13
Merci beaucoup pour ce peu d'histoire. J'ai récemment désactivé le contrôle de flux par défaut dans un émulateur de terminal que je maintiens, mais j'ai dû le rétablir assez rapidement après les protestations vocales des traditionalistes Unix qui l'utilisent toujours. Je mets le bit ixany à la place, donc au moins les personnes qui appuient sur ^ S sans savoir à propos de ^ Q ne restent pas coincées.
ak2
3
@RBerteig J'ai rencontré quelque chose de similaire sur le backspace et la suppression. Retour arrière est officiellement ^ H et supprimer est ^? Certaines personnes, comme les développeurs Emacs (encore une fois Stallman?), Voulaient que ^ H soit disponible à des fins générales, comme des raccourcis tels que Aide. La séquence d'échappement ^ [[3 ~ ou quelque chose du genre a été créée pour remplacer ^? et backspace est maintenant devenu le vieux caractère de suppression ^ ?. En fait, j’ai vu des ncurses corrigées sur les distributions Linux pour remapper ces clés dans terminfo alors que ncurses sur FreeBSD n’était pas corrigé, ce qui entraînait une partie de la confusion gênante qui empêchait le retour arrière.
Penguin359
23
J'avais l'habitude de me demander pourquoi DEL avait le code 127 plutôt que d'être groupé avec les autres caractères de contrôle, jusqu'à ce que je commence à jouer avec du papier et un ASR33. Une fois que j'ai réalisé que cela avait pour effet de perforer tous les trous, ce qui signifiait qu'il pouvait être effondré sur n'importe quel caractère précédemment perforé pour le supprimer, cela avait du sens.
RBerteig
3
@SanuelJackson Cela fait quelque temps que j'ai regardé de près, mais le vimrc par défaut livré avec Windows a mappé <Cs> sur ": update" pendant de nombreuses années. Je suis également à peu près certain d’avoir déjà vu cela dans certaines distributions de gvim. Toutefois, si vous utilisez vim dans un terminal, cet historique est toujours très pertinent. Les émulateurs de terminaux modernes implémentent toujours les clés de contrôle de flux. Ainsi, même si vim les mappait, il ne les verrait jamais à moins que chaque utilisateur ne désactive le contrôle de flux comme décrit dans la réponse acceptée.
Drew