Page suivantePage précédenteTable des matières

15. Terminfo et Termcap (en détails)

15.1 Introduction à Terminfo

Terminfo (anciennement termcap) est une base de données des capacités des terminaux et plus. Pour chaque (enfin presque) modèle de terminal elle indique aux applications ce que le terminal est capable de faire. Elle indique quelles séquences d'échappement (ou caractère de contrôle) envoyer au terminal afin de faire des choses telles que déplacer le curseur vers un nouvel endroit, effacer une partie de l'écran, faire défiler l'écran, changer de mode, changer l'apparence (couleurs, luminosité, clignotement, soulignement, vidéo inverse, etc.). À partir de 1980 environ, beaucoup de terminaux supportaient plus d'une centaine de commandes (certaines d'entre elles prenant des paramètres numériques).

La façon dont terminfo donne les information a un programme est par les fonctions "ncurses" que le programmeur met dans un programme C. Par exemple si un programme veut bouger le curseur à la ligne 3, colonne 6, il appelle simplement: move(3,6). La fonction move() (faisant partie de ncurses) sait comment faire pour votre terminal (elle peut lire terminfo). Donc il envoit la sequence d'échappement appropriée au terminal qui lui fait faire ce mouvement.

Les abréviations terminfo sont en général plus longues que celles de termcap et il est ainsi plus facile de deviner ce qu'elles veulent dire. Les pages de manuel de terminfo sont plus détaillées (et incluent les anciennes abréviations de termcap). Ainsi, sauf si vous êtes déjà obligé de travailler avec termcap, il est suggéré que vous utilisiez les fichier terminfo.

15.2 Base de données terminfo

Introduction

La base de données terminfo est compilée et possède ainsi une partie source et une partie compilée. La vieille base de données termcap ne possède qu'une partie source mais cette source peut, grâce à une seule commande, être à la fois convertie en source terminfo et ensuite compilée. Vous pouvez ainsi vous en tirer sans avoir le source terminfo puisque le source termcap peut créer la base terminfo compilée. Pour voir un affichage de la base de données pour le terminal que vous utilisez actuellement (y compris un moniteur de PC), tapez "infocmp" et vous devriez voir le "fichier" source terminfo correspondant.

Pour voir si votre terminal (disons vt100) est dans la base de données terminfo, tapez "locate vt100". Si vous ne connaissez pas le nom de votre terminal, explorez la liste des fichiers dans la base de données compilée ou voyez quel est le nom terminfo de mon terminal ?.

Où se trouve la base de données ?

Emplacements de la base de données compilée

Le fait de taper "locate vt100" peut vous indiquer /usr/lib/terminfo/v/vt100, /usr/share/terminfo/v/vt100, /home/vous/.terminfo/v/vt100 et/ou /etc/terminfo/v/vt100. Tout ceci sont des localisations possibles des fichiers terminfo compilés. Quoique le répertoire /etc/terminfo ne soit pas l'emplacement standard pour ca, avoir quelques types de terminal a cet endroit peut être pratique au cas ou le répertoire /usr ne soit pas accessible. Par exemple, /usr peut être placé sur un disque ou une partition qui n'ait pas pue être montée. Normalement, les applications qui utilisent votre base de donnée terminfo principale sont capables de les trouver si il est mis dans au moin un des emplacements mentionnés avant. Autrement la variable d'environnement TERMINFO devrait être positionnée sur le chemin vers cette base de données. Exemple : TERMINFO=/usr/share/terminfo.

Si le terminfo compilé se trouve à plus d'un endroit, tout se passe en général bien jusqu'à ce que quelqu'un récupère un ou plusieurs fichiers terminfo (d'une distribution plus récente, d'Internet, en éditant la plus vieille, etc.). Le nouveau terminfo doit être placé à tous les emplacements existants (ou les emplacements redondants doivent être abolis). Si vous ne vous assurez pas que c'est fait, alors plusieurs applications peuvent se retrouver à chercher et utiliser les anciennes données terminfo (boguées) qui existent encore à un emplacement "traditionnel".

Emplacements du code source des bases de données

Le code source que vous utilisez peut résider dans /etc/termcap et/ou dans terminfo.src (ou un autre nom). Voyez les pages de manuel : terminfo(5) ou termcap(5) pour voir le format nécessaire pour créer (ou modifier) ces fichiers source. Le fichier terminfo.src peut se trouver en divers endroits sur votre ordinateur ou peut ne pas être inclus dans votre distribution Linux. Utilisez la commande locate pour essayer de le trouver. Il est disponible pour téléchargement (sous le nom termtypes.ti) à http://sagan.earthspace.net/terminfo.

Compilateur terminfo (tic)

Les données des fichiers sources sont compilées avec le programme "tic" qui est capable de faire les conversions entre les formats termcap et terminfo. Vous pouvez ainsi créer une base de données terminfo compilée à partir d'un source termcap. Le programme d'installation utilisé pour installer Linux a probablement installé les fichiers compilés sur votre disque dur donc vous ne devez rien compiler sauf si vous modifiez /etc/termcap (ou terminfo.src). "tic" installera automatiquement les fichiers compilés résultant dans un répertoire terminfo prêt à être utilisé par les applications.

Regardez votre terminfo

C'est une bonne idée de jeter un coup d'oeil à votre entrée terminfo pour le terminal que vous utilisez (le code source, bien sûr) et de lire les commentaires. Une manière rapide de l'inspecter sans les commentaires est de taper simplement "infocmp". Mais les commentaires pourront vous dire des choses spéciales sur le terminal comme la manière dont vous devez le configurer pour qu'il fonctionne correctement avec la base de données terminfo.

Effacer des données non nécessaires

Afin d'économiser de l'espace disque, on peut effacer toute la base de données à part les types de terminaux que l'on possède (ou dont on pourrait avoir besoin dans le futur). N'effacez aucun termcap pour un "terminal Linux" (la console) ou les entrées xterm si vous utilisez X Window. Le type de terminal "dumb" peut être nécessaire quand une application ne peut pas déterminer le type de terminal que vous utilisez. Cela économiserait de l'espace disque si les programmes d'installation n'installaient les terminfo que pour les terminaux que vous possédez et que vous puissiez obtenir un termcap pour un nouveau terminal sur Internet en quelques secondes.

15.3 Bogues dans les fichiers terminfo existants (et dans le matériel)

Malheureusement, il y a un certain nombres de bogues dans les fichiers terminfo et termcap. En plus, bien des définitions ne sont pas complètes et ne définissent pas certaines capacités disponibles sur les terminaux. Parfois vous pouvez vous en tirer sans modifier terminfo mais dans d'autres cas vous devez le modifier ou peut-être utiliser une autre émulation qui possède un bon terminfo.

Le mauvais état des fichiers terminfo fournis est dû à un certain nombre de raisons. L'une d'entre elles est que durant les années 1980, quand on en a écrit beaucoup (souvent au format termcap), les applications n'utilisaient les capacités avancées des terminaux. Ainsi, si une telle capacité n'était pas dans le fichier termcap (ou terminfo), personne ne se plaignait. Aujourd'hui, les programmes tels que vim utilisent la "colorisation contextuelle" et minicom utilise le code de caractère graphique du terminal. Ceux-ci ont souvent besoin de plus de définitions à ajouter à l'ancien termcap. Ceci peut (ou peut ne pas) avoir déjà été fait.

La plupart des terminaux avaient des bogues matériels (dans leur programme interne) qui étaient parfois "réparés" en modifiant le termcap. Ensuite, le fabricant pouvait envoyer des puces de remplacement qui réparaient le bogue. Tous les propriétaires ne passaient pas leur temps à obtenir les puces de remplacement. Ainsi il peut y avoir deux terminfos ou plus pour votre terminal, selon les puces qu'il possède. Cette situation n'était pas toujours notée dans le termcap et un seul termcap peut être fourni avec Linux. Certains bogues matériels présents pour des capacités qui n'étaient quasiment jamais utilisées dans le passé n'ont sûrement jamais été réparés. De plus, certaines bogues matériels rapportés peuvent ne jamais avoir été réparés puisqu'ils n'étaient pas très importants à l'époque ou que la société est décédée, etc.

15.4 Modification des fichiers terminfo

Pour faire ceci vous avez besoin du manuel de votre terminal indiquant les séquences d'échappement qu'il utilise. Les manuels récents des années 1990 ne les montrent pas souvent. Vous avez aussi besoin d'un manuel terminfo (ou similaire). Par exemple, afin d'ajouter des capacités graphiques vous devez assigner des valeurs aux variables terminfo : enacs, rmacs et smacs en éditant un fichier source. Alors en utilisant "tic" vous pouvez le compiler. "tic" devrait placer automatiquement le fichier terminfo compilé dans le répertoire correct réservé à cet usage.

Si vous voulez trouver un meilleur terminfo pour un certain terminal que celui qui est fourni, vous pouvez essayer de chercher sur Internet (mais ce que vous y trouverez peut être pire). Si votre nouvelle entrée terminfo est meilleure que l'ancienne et semble stable (vous l'avez utilisée pendant un moment sans problèmes) vous devriez en envoyer une copie au mainteneur de terminfo comme indiqué au début du fichier source de terminfo (ou termcap).

15.5 Chaîne d'initialisation

Dans le terminfo sont souvent incluses des chaînes d'initialisation qu'on peut envoyer au terminal pour l'initialiser. Cela peut modifier l'apparence de l'écran, changer le mode dans lequel se trouve le terminal et/ou faire que le terminal émule un autre terminal. Une chaîne d'initialisation n'est pas envoyée automatiquement au terminal pour l'initialiser. On pourrait espérer que le programme getty le fasse mais s'il le faisait, on pourrait faire un changement de configuration sur le terminal et ce changement ne serait pas pris en compte parce que la chaîne d'initialisation l'annulerait automatiquement. Vous devez utiliser une commande sur la ligne de commande (ou dans un script shell) pour envoyer la chaîne d'initialisation telle quelle. De telles commandes sont : "tset", "tput init" ou "setterm -initialize". Parfois il n'y a pas besoin d'envoyer la chaîne d'initialisation puisque le terminal peut se configurer correctement quand il est allumé (en utilisant les options et préférences qu'on a sauvées dans la mémoire permanente du terminal).

15.6 Variable TERM

La variable d'environnement TERM devrait être initialisée au nom de terminal que vous utilisez. Si TERM n'a pas encore été positionnée et que vous ne connaissez pas le nom de votre terminal, voyez quel est le nom terminfo de mon terminal ?. Elle est normalement positionnée par le paramètre terminal_type passé au programme getty (regardez-le dans le fichier /etc/inittab). Ce nom doit se trouver dans la base de données terminfo. Tapez simplement "set" sur la ligne de commande pour voir quelle valeur a TERM (ou tapez : tset -q). Sur la console (moniteur) TERM est positionné à "linux" qui représente le moniteur du PC émulant un modèle de terminal fictif appelé "linux". Puisque "linux" est proche d'un terminal vt100 et que beaucoup de terminaux le sont aussi, l'appellation "linux" fonctionnera parfois comme un recours temporaire sur un terminal texte.

Si on peut connecter plus d'un type de terminal sur le même port (/dev/tty...) (par exemple, si un commutateur permet à différents types de terminaux d'utiliser le même port série, ou si le port est relié à un modem que des personnes appellent depuis différents types de terminaux) alors TERM doit être positionné à chaque fois que quelqu'un se connecte sur le port série. Il y a souvent une séquence d'échappement de requête pour que l'ordinateur puisse demander au terminal de quel type il est. Une autre façon est de demander à l'utilisateur de taper (sélectionner) le type de terminal qu'il ou elle utilise. Vous aurez peut-être besoin d'utiliser tset ou d'écrire un petit script shell pour gérer cela.

Une manière est d'utiliser "tset" (voir la page de manuel). tset essaie de déterminer le nom du terminal à partir du terminal que vous utilisez. Il regarde ensuite les données dans terminfo et envoie une chaîne d'initialisation à votre terminal. Il peut aussi positionner la valeur de TERM. Par exemple, un utilisateur appelle et se logge. Le script de login .profile est exécuté et il contient la commande suivante : eval `tset -s ?vt100`. Ceci fait que : on demande à l'utilisateur s'il ou elle utilise un vt100. L'utilisateur répond oui ou bien tape le type de terminal réel qu'il ou elle utilise. tset envoie ensuite la chaîne d'initialisation et positionne TERM à ce nom (type) de terminal.

15.7 Documents sur terminfo/termcap


Page suivantePage précédenteTable des matières