Termcap

Depuis l'aube des systèmes de type Unix, il a toujours été possible de connecter des terminaux sur un serveur. Le principal problème rencontré, aussi bien à l'époque que de nos jours, est le fait que tous les terminaux ne soient pas strictement identiques. Bien sûr, quelques normes ont réussi à se faire une place comme le modèle VT100, mais il en existe bien d'autres. Tous ces terminaux diffèrent sur plusieurs points : nombre de lignes et de colonnes, caractéristiques d'affichage, codes de contrôle, etc.

Pour résoudre le problème, il faut réussir à faire comprendre au serveur ce que sait faire le terminal et trouver un moyen de dialoguer avec lui. Voilà exactement le travail accompli par termcap.

Par contre, tous les logiciels existants n'ont pas besoin de connaitre les informations liées au terminal. C'est le cas des logiciels affichant simplement du texte. En revanche, lorsque le programme est interactif et affiche des menus et des boîtes de dialogue (vi, mc, etc.), les informations fournies par termcap deviennent indispensables. Les logiciels doivent alors consulter la base de données termcap pour pouvoir échanger des informations avec l'utilisateur de manière correcte.

Nos plus anciens lecteurs ont déjà eu affaire à termcap dans le cadre de la connexion d'un Minitel en tant que terminal Unix (Lmag 1 - pages 58/59). En effet, les codes de contrôle d'un Minitel n'ont rien à voir avec ceux couramment utilisés. Il était donc nécessaire d'expliquer au serveur le langage spécifique au Minitel.

Pour préciser encore davantage l'implication de termcap dans votre système, sachez que l'écran et le clavier reliés à votre ordinateur constituent un terminal. Pour vous en convaincre, tapez la commande echo $TERM. Celle-ci vous retournera le profil de terminal en cours d'utilisation.

Signalons au passage que termcap n'est pas la seule solution pour gérer les terminaux. Il existe également terminfo, mais celui-ci semble moins utilisé.

TERMCAP ET TERMINFO

Comme nous venons de le dire, termcap et terminfo font le même travail. La principale caractéristique de fonctionnement qui les différencie est l'aspect des bases de données.

La base termcap, matérialisée par le fichier /etc/termcap, est un fichier ASCII lisible par un humain (sans pour autant être compréhensible immédiatement).

A l'opposé, nous avons terminfo dont la base est compilée et répartie dans une arborescence classée alphabétiquement. Vérifiez dans votre répertoire /usr/lib/terminfo ou /usr/share/terminfo : vous trouverez une série de sous-répertoires comprenant les fichiers terminfo compilés. Nous arrêtons là nos explications car terminfo fera l'objet d'un autre article dans le prochain numéro.

LE FICHIER TERMCAP

La manière la plus simple de procéder devant toujours servir d'exemple, voici une entrée termcap typique :

linux|linux-lat|linux console:\

:am:eo:mi:ms:ut:xn:xo:\

:co#80:it#8:li#25:\

:&7=^Z:@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\

:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:\

:F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:\

:IC=\E[%d@:K2=\E[G:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:\

:ch=\E[%i%dG:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\

:cs=\E[%i%d;%dr:ct=\E[3g:cv=\E[%i%dd:dc=\E[P:dl=\E[M:\

:do=^J:ei=\E[4l:ho=\E[H:ic=\E[@:im=\E[4h:k1=\E[[A:\

:k2=\E[[B:k3=\E[[C:k4=\E[[D:k5=\E[[E:k6=\E[17~:\

:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kB=\E[Z:\

:kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:\

:kh=\E[1~:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:mr=\E[7m:\

:nd=\E[C:nw=^M^J:r1=\Ec:rc=\E8:sc=\E7:sf=^J:sr=\EM:\

:st=\EH:ta=^I:u6=\E[%i%d;%dR:u7=\E[6n:u8=\E[?6c:\

:u9=\E[c:up=\E[A:vb=200\E[?5h\E[?5l:ve=\E[?25h:\

:vi=\E[?25l:tc=klone+sgr:tc=klone+color:tc=klone+acs:

A première vue, la chose est parfaitement illisible. Une entrée dans la base termcap est composée de différents champs. Le séparateur entre les champs est le double point (:). Chaque entrée de la base est présentée sur UNE SEULE LIGNE. Ceci explique la présence du symbole \ permettant de revenir à la ligne pour des raisons esthétiques sans influer sur l'interprétation de la base.`

Le premier champ d'une entrée termcap est TOUJOURS le nom du terminal et ses alias, séparés par le symbole |. Les alias permettent de donner plusieurs noms à une seule et même entrée dans la base. Les codes étranges qui suivent le premier champ sont les différentes variables permettant de définir les caractéristiques du terminal.

Il existe trois types de variables :

- les booléennes : leur seule présence dans un des champs permet d'activer une caractéristique. Exemple : si bs est présente dans l'entrée, cela signifie que le terminal sait faire usage du backspace (correction arrière). De la même manière, la présence de am permet de déterminer que le terminal sait gérer le passage automatique à la ligne (auto margin).

- les numériques : elles permettent de renseigner sur une valeur numérique propre au terminal. Par exemple, dans le cas de co#80, il est déclaré que le terminal affiche 80 colonnes. Idem pour il#25 qui signifie affichage de 25 lignes.

- les chaînes de caractères : elles permettent principalement de définir des séquences de contrôle.

Exemple : ta=^I permet de définir le code associé à la tabulation, ici CTRL I.

Toutes les variables sont documentées dans la man page de termcap.

Pour plus d'informations, vous pourrez tout savoir sur termcap et terminfo grâce à l'ouvrage écrit par :

John Strang, Linda Mui et Tim O'Reilly,

édité chez O'Reilly

sous le titre « termcap & terminfo »,

ISBN 0-937175-22-6 (en anglais).


© Copyright 2000 Diamond Editions/Linux magazine France. - Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1or any later version published by the Free Software Foundation; A copy of the license is included in the section entitled "GNU Free Documentation License".