Ctrl-s hang émulateur de terminal?

311

Je suis tombé sur une phrase dans vimdoc:

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

et cette clef accroche en effet mon vim. Je pensais que c'était la faute de vim, puisqu'il n'y avait aucun problème lorsque j'utilise C-s/ C-x C-sdans emacs nox. Cependant, tout à l'heure, lorsque je lisais une page de manuel et appuyais sur la touche Ctrl-s, elle se bloque man également (je suis lessen mode PAGER).

Alors quelqu'un peut-il me dire ce qui se passe?

Les émulateurs de terminal sont xtermet lxterminal, et a ttyégalement ce problème. Et a Ctrl+ qremet le processus en place dans tous les cas.

Hongxu Chen
la source
6
C'est peut-être une question stupide mais vous n'avez pas mentionné ce que vous avez essayé dans votre question. Vous avez essayé C-qde réactiver le défilement, non?
h3rrmiller
3
@ h3rrmiller ouais, c'est vrai. Mais je voudrais juste savoir pourquoi ctrl-sle processus est suspendu.
Hongxu Chen
avant il y avait des claviers avec la touche de verrouillage du défilement C-set C-qétaient à l'époque "commutateur de verrouillage du défilement". vous pouvez désactiver cette fonctionnalité en ajoutant stty ixanyet stty ixoff -ixonà votre.bashrc
h3rrmiller le
2
C'est un cadre historique stupide de nos jours dans les émulateurs de terminaux; Voir cette question connexe pour savoir comment réparer votre terminal.
Ingo Karkat
1
@ IngoKarkat Je ne dirais pas que c'est stupide ... Je l'utilise encore de temps en temps
h3rrmiller

Réponses:

361

Cette fonctionnalité s'appelle le contrôle de flux logiciel (contrôle de flux XON / XOFF)

Quand une extrémité de la liaison de données (dans ce cas l'émulateur de terminal) ne peut plus recevoir de données (parce que le tampon est plein ou presque plein ou que l'utilisateur envoie C-s), il enverra un "XOFF" pour indiquer à l'expéditeur le message liaison de données pour faire une pause jusqu'à ce que le signal "XON" soit reçu.

Ce qui se passe sous le capot, c’est que le "XOFF" demande au pilote TTY du noyau de mettre le processus qui envoie les données dans un état de veille (comme une pause dans un film) jusqu'à ce que le pilote TTY reçoive un "XON" le noyau pour reprendre le processus comme s’il n’avait jamais été arrêté.

C-sactive le verrouillage du défilement du terminal. Ce qui empêche votre terminal de défiler (En envoyant un signal "XOFF" pour mettre en pause la sortie du logiciel).

C-qdésactive le verrou de défilement. Reprise du terminal en défilement (En envoyant un signal "XON" pour reprendre la sortie du logiciel).

Cette fonctionnalité est héritée (à l'époque où les terminaux étaient très lents et n'autorisait pas le défilement) et est activée par défaut.

Pour désactiver cette fonctionnalité, vous devez disposer des éléments suivants dans ~/.bash_profileou ~/.bashrc:

stty -ixon
h3rrmiller
la source
10
En fait, je pense que cela remonte enfin aux années 70, voire 60.
Keith
Cependant, il ne semble pas fonctionner sur Ubuntu 16.04.
Robert
3
"stty -ixon" <----- c’est l’une des choses les plus importantes que j’ai lues sur Internet au cours de la dernière semaine. Merci.
Brad P.
En fait, l’histoire commence plusieurs décennies plus tôt que les années 80. Voir Le téléscripteur démystifié .
RoboAlex
25

A la fin de mon .bashrcscript, j'ai ajouté:

#so as not to be disturbed by Ctrl-S ctrl-Q in terminals:
stty -ixon
Stéphane Rolland
la source