• # ASCII

    Posté par . En réponse au journal Bash et les raccourcis clavier. Évalué à 10. Dernière modification le 20 septembre 2017 à 17:32.

    Pour exécuter une commande que vous venez de taper, pressez: C-m: Retour charriot

    Il existe un raccourci pour envoyer le caractère EOF (End Of File): C-d.
    ...
    Il est possible de supprimer un caractère avant ou après le curseur avec les raccourcis:
    C-d: Supprimer le caractère qui se trouve après le curseur

    On note que ça fait double-emploi...

    Faire appel à l'auto-complétion de Bash peut se faire avec le raccourci: C-i: Équivalant à la touche TAB

    Il est possible de manipuler ce que montre Bash à l'écran avec ces trois raccourcis:

    C-l: Nettoie l'écran, pour ne montrer qu'une invite de commande vide. Similaire à la commande clear.
    C-s: Stop l'affichage. Très utile quand un programme très verbeux s'exécute.
    C-q Reprend l'affichage stoppé avec C-s.

    Ça vaut le coup de rappeler que tous les « raccourcis » ci-dessus, même si certains d'entre eux restent interceptés par le shell, ne sont pas des combinaisons choisies arbitrairement par lui, mais font partie à la base du code ASCII.

    Il est utile de rappeler également que la touche « Ctrl » n'est pas une simple meta-key comme Alt, mais sert en principe à émettre les codes de contrôle de la table ASCII (soit les codes 0 à 31 en début de table), codes qui étaient le seul moyen de piloter les appareils et terminaux lorsqu'il étaient reliés à leur hôte à l'aide d'une ligne série. Donc saisir Ctrl+A, Ctrl+B, Ctrl+C... jusqu'à Ctrl+Z, permet d'émettre les codes 1 à 26.

    C'est aussi pour cela que Escape est placé juste après cette gamme, sur le code 27. ESC étant justement le code permettant de s'échapper du flux ASCII standard et d'annoncer une séquence hors-protocole, ce qui permet de passer la main à n'importe quel standard.

    Et c'est pour cela encore qu'on trouve la touche sur pratiquement tous les ordinateurs et terminaux depuis les années 1960. Elle est donc réellement censée émettre un caractère à chaque fois qu'on la combine avec une lettre, et pas n'importe lequel : le code de 1 à 26, soit 0x01 à 0x1a en hexadécimal. Donc, on doit pouvoir capter la saisie de ce caractère avec un simple fgetc() ou équivalent (sauf s'il est intercepté entre les deux par une sous-fonction du shell ou autre). Essayez avec stty -icanon ; od -tx1 -vw1, par exemple. C'est totalement différent de « Alt » par exemple, qui à ma connaissance est spécifique à l'IBM PC (même si d'autres machines ont des meta-key similaires depuis longtemps) et qui n'est pas du tout tenue d'émettre quoi que ce soit (ce qui rendait d'ailleurs son exploitation compliqué quand on écrivait ses premiers programmes en BASIC).

    Du coup :
    - Ctrl+I : Neuvième lettre, 09 ou 0x09 → « HT Horizontal tabulation », donc le code ASCII d'une tabulation. C'est donc normal qu'elles émettent le même code. Essayez avec la commande ci-dessus pour vous en convaincre...

    • Ctrl+M : Treizième lettre, 13 ou 0x0d → « CR Carriage Return », code de retour en début de ligne.

    • Ctrl+L : Douzième lettre, 12 ou 0x0c → « FF Form Feed », soit littéralement : « alimentation en papier (ou même "en formulaire") ». C'est en principe à l'usage des imprimantes et cela sert à leur commander d'aspirer une feuille et de présenter le haut de la page devant la tête d'impression pour commencer à écrire dessus. Et évidemment, s'il y a déjà une feuille en cours de traitement, celle-ci est éjectée (laissant donc le reste vide) pour avancer directement à la suivante, ce qui correspond donc à un saut de page. Et sur les terminaux dont le système d'impression a été remplacé par un écran, ça revient donc à effacer la page et à replacer le curseur en haut à gauche.

    Ça marche normalement sur toute imprimante qui se respecte, mais à condition que ce soit une matricielle (continue ou feuille à feuille) ou à la limite une jet d'encre, qui peuvent encore fonctionner en mode texte même si les pilotes le font de moins en moins, mais pas les laser dont le mode de fonctionnement (dépôt de poudre sur la feuille puis passage au four) leur impose de traiter toute la feuille en une seule opération, sauf si elles peuvent bufferiser le texte jusqu'au moment où il faut éjecter la page, soit une page pleine ou justement un code 12 «FF».

    Côté écrans, ça marchait sur de nombreux huit bits, et notamment sur tout ce qui était Vidéotex, donc sur les Minitel et sur les 8 bits Thomson (MO6, TO8, etc.). C'était aussi plus pratique qu'un « CLS » pour avoir un écran vraiment propre et éviter le « OK » associé à la commande. Évidemment, l'une des exceptions est justement les DEC ANSI :-( Standard suivi par la console des PC, que ce soit DOS ou les consoles virtuelles de Linux, et par les XTerm. Par contre, le shell a conservé cette fonctionnalité et l'émule proprement (même si c'est lui qui le fait) et c'est pour cela qu'il en profite pour ré-afficher l'invite de commande.

    • Ctrl+S Ctrl+Q : Ce sont en fait directement les codes de XON et XOFF qui sont les codes dédiés au contrôle de flux lorsque la ligne n'est pas équipé de signaux physique pour le faire (comme RTS et CTS sur RS/232). Ce n'était pas directement ASCII mais presque : la page wikipédia indique que ça a été introduit par le Teletype Model 33 en 1963, c'est-à-dire l'année de publication de la première version du standard ASCII, et ces codes sont mappés sur DC1 et DC3, sachant qu'il y a quatre code DC1 à DC4 dans ASCII et que DC signifie « Device Control ». Ce sont donc des codes génériques permettant de piloter des fonctionnalités spécifiques à chaque appareil.

    Là encore, les terminaux et les premiers ordinateurs personnels fonctionnaient uniquement en mode texte, donc interrompre le flux en provenance du serveur permettait de suspendre le défilement à l'écran (c'était aussi pratique pour les imprimantes qui n'arrivaient pas forcément à suivre) et Linux mappe ça en principe, sur ses consoles virtuelles (pas sous X-Window) avec la touche Pause du PC et sa LED associée, touche qui sert initialement à ça même sur PC (apparu en 1981, pas dans les années 60). Bon, évidemment, je viens d'essayer avec une Fedora 25. Ctrl+S Ctrl-Q fonctionnent toujours mais plus la touche Pause. Bon.

    • Ctrl+D enfin, correspond à « EOT End of Transmission », ce qui est bien pratique pour dire « j'ai fini de parler », surtout sur les lignes half duplex. Du coup, sur un terminal, ça sert surtout à envoyer ce que l'on vient de saisir SANS appuyer sur Return et donc embarquer un retour chariot avec le reste. Ce n'est pas, à la base, directement un raccourci pour « exit », mais saisir Ctrl+D seul permet d'envoyer une charge utile de zéro caractère, ce qui est en soi reconnu par read() comme le signal d'une fin de connexion et de la refermeture du canal. Cela va donc provoquer un EOF exactement comme la fin d'un fichier qui aurait été atteinte si ce fichier avait été redirigé vers l'entrée standard du processus avec « < ». Le shell se termine donc normalement (en le détectant) mais ça fonctionne en fait avec tout processus à l'avant plan et fait pour gérer normalement l'entrée standard. Essayez avec cat par exemple.