<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
  "http://www.docbook.org/xml/4.3/docbookx.dtd">

<article class="techreport" id="index" lang="fr">

  <articleinfo> 

<title>Petit guide pratique des touches <keycap>Backspace</keycap>
et <keycap>Suppr</keycap> sous Linux</title>

  <subtitle>
  
     Version française du petit guide <foreignphrase>Linux 
     Backspace/Delete mini-HOWTO</foreignphrase>
  
  </subtitle>

<!-- 

NOTE POUR LE RELECTEUR

Voici les mots qui m'ont posé le plus de problèmes :
* Backspace : faut-il traduire ? si oui, comment ?
* Key capability : aucune idée de comment on peut traduire ça. J'ai
  mis capabilité par convention, mais c'est très mauvais.
* Scancode : code de balayage ?
* Keysym : touche symbolique ou symbole clavier ?
* mapped : mappé ?
* entry/input : j'ai traduit les deux par Entrée, mais ça fait une
  ambiguïté
  
-->

<author> 
                <firstname>Sebastiano</firstname> 
                <surname>Vigna</surname> 
                <affiliation> 
                <address><email>vigna@acm.org</email></address>
                </affiliation> 
</author> 

  <othercredit role="traduction">
     <firstname>Baptiste</firstname>
     <surname>Mélès</surname>
     <contrib>Adaptation française</contrib>
     <email>baptiste POINT meles CHEZ ens POINT fr</email>
  </othercredit>

    <!-- À remplir par le relecteur -->

<!--

    <othercredit role="relecture">
       <firstname></firstname>
       <surname></surname>
       <contrib>Relecture de la version française</contrib>
       <email></email>
    </othercredit>

-->

    <othercredit role="publication">
       <firstname>Jean-Philippe</firstname>
       <surname>Guérard</surname>
       <contrib>Préparation de la publication de la v.f.</contrib>
       <email>fevrier CHEZ tigreraye POINT org</email>
    </othercredit>

  <releaseinfo>Version&nbsp;: 1.6.fr.1.0</releaseinfo>  

  <pubdate>5 novembre 2004</pubdate>

<revhistory>
      <revision>
                  <revnumber>1.6.fr.1.0</revnumber>
                  <date>2004-11-05</date>
                  <authorinitials>BM, XX, JPG</authorinitials>
      
                  <!-- Remplacer XX par les initiales du relecteur -->

                  <revremark>
                  
                      Première adaptation française.
                  
                  </revremark>  
      </revision>
      <revision>
                  <revnumber>1.6</revnumber> 
                  <date>2002-01-19</date>
                  <authorinitials>SV</authorinitials>
                  <revremark>
                  
                  J'ai inclus de nombreux commentaires d'Alex Boldt et 
                  Chung-Rui Kao
                  
                  </revremark>  
      </revision>
      <revision>
                  <revnumber>1.5</revnumber> 
                  <date>2001-05-03</date>
                  <authorinitials>SV</authorinitials>
                  <revremark>
                  
                  Mise à jour pour les nouvelles distributions et 
                  l'astuce du tput. <emphasis lang="en">Updated for new 
                  distros and the tput trick.</emphasis>
                  
                  </revremark> 
      </revision>
      <revision>
                  <revnumber>1.4</revnumber> 
                  <date>2000-12-07</date>
                  <authorinitials>SV</authorinitials>
                  <revremark>
                  
                  Mise à jour pour les conflits de Red Hat 7.0 et de 
                  Helix Gnome. <emphasis lang="en">Updated for Red Hat 
                  7.0 and Helix Gnome conflicts.</emphasis>
                  
                  </revremark>
      </revision>
      <revision>
                  <revnumber>1.3</revnumber> 
                  <date>2000-10-15</date>
                  <authorinitials>SV</authorinitials>
                  <revremark>
                  
                  Changement du nom. <emphasis lang="en">Name 
                  change.</emphasis>
                  
                  </revremark>
      </revision>
      <revision>
                  
                  <revnumber>1.2</revnumber>
                  <date>2000-10-15</date>
                  <authorinitials>SV</authorinitials>
                  <revremark>
                  
                  Mise à jour. Ajout de la section «&nbsp;Que faire si 
                  rien ne marche&nbsp;». <emphasis lang="en">Updated. 
                  Added "What If Nothing Works" section.</emphasis>
                  
                  </revremark>
      </revision>
      <revision>
         <revnumber>1.1</revnumber>
         <date>2000-09-13</date>
         <authorinitials>SV</authorinitials>
         <revremark>

             Ajout de réglages pour tcsh. <emphasis lang="en">Added tcsh 
             fixes</emphasis>

         </revremark>
      </revision>
      <revision>
         <revnumber>1.0</revnumber>
         <date>2000-09-05</date>
         <authorinitials>SV</authorinitials>
         <revremark>
          
             Première version. <emphasis lang="en">First 
             release</emphasis>
             
         </revremark>
      </revision>
</revhistory>


  </articleinfo>
  
  <sect1 id="intro">
<title>Introduction</title> 


 <para>
 
   Tout utilisateur de Linux a tôt ou tard été confronté à une situation 
   dans laquelle il semblait impossible d'avoir des touches 
   <keycap>Backspace</keycap> et <keycap>Suppr</keycap> qui 
   fonctionnent, en console comme sous X. Cette page explique ce  
   phénomène et y suggère des solutions. Dans l'ensemble, les notions 
   abordées ici sont indépendantes de la distribution utilisée&nbsp;: mais en 
   raison de l'étendue  des  différences  entre  les  fichiers  de 
   configuration du système  selon les distributions, j'essaierai de 
   donner au lecteur suffisamment  de  connaissances pour concevoir ses 
   propres réglages en cas de besoin.
   
</para>  

<para>

Je suppose que la touche <keycap>Backspace</keycap> doit revenir d'un 
caractère puis effacer le caractère qui est placé sous le curseur. Au 
contraire, la touche <keycap>Suppr</keycap> doit effacer le caractère 
qui est placé sous le curseur, sans que ce dernier ne bouge. Si vous 
pensez que la fonction des deux touches doit être intervertie, en dépit 
du fait que la majorité des claviers fournisse une flèche orientée vers 
la <emphasis>gauche</emphasis> (<keycap>&larr;</keycap>) sur la touche 
<keycap>Backspace</keycap>, alors cette page ne vous donnera pas de 
solutions immédiates, mais vous pourrez néanmoins trouver très utiles 
les explications données ici.

</para>

<para>

Je suppose également que les réglages ne devraient modifier que des 
fichiers locaux (d'un utilisateur). Aucune partie standard de la 
distribution ne devrait être altérée. Enfin, ce document traite de la 
façon dont il faut configurer votre système pour que les applications 
reçoivent les bons événements clavier. Si une application décide 
d'interpréter de tels événements d'une façon idiosyncratique, le seul 
réglage possible est de reconfigurer l'application.

</para>

    <note>
    <para>

Depuis la première version de ce petit guide pratique, les choses se 
sont encore embrouillées. Différentes distributions d'un même émulateur 
de terminal (par exemple <application>gnome-terminal</application> tel 
qu'il est fourni par Red Hat 7.0, Helix Code/Ximian ou même Red 
Hat&#8805;7.1) génèrent des séquences <acronym>ASCII</acronym>. En 
raison de cette dissonnance, les actuelles bases de données de terminal  
correspondent encore moins aux émulateurs de terminal qu'elles sont 
supposées décrire. Afin de donner un fondement solide aux explications 
qui suivent, nous supposons foncièrement corrects les paramètres 
proposés par la <ulink 
url="http://www.debian.org/doc/debian-policy/">politique relative au 
clavier adoptée par Debian</ulink>.
 
</para> 
    </note>

  </sect1>

  <sect1 id="actions">
<title>Comment les touches sont converties en actions</title> 

<para>

Lorsque l'on appuie sur une touche, un nombre de composants matériels et 
logiciels coopèrent afin de garantir que la signification de la touche 
que l'on a dans l'esprit (par exemple, d'émettre un certain caractère) 
concorde avec le comportement effectif de la touche. Je me concentrerai 
sur l'aspect logiciel (dans la mesure où notre contrôle sur le matériel 
est inexistant), et en particulier, provisoirement, sur les événements 
clavier liés à la sortie en console.
 
</para>

<orderedlist>
                <listitem>
<para>

L'appui sur une touche génère de purs <firstterm>codes de 
balayage</firstterm> 
(<emphasis><firstterm>scancodes</firstterm></emphasis>) du clavier&nbsp;; ces 
codes de balayage sont ensuite transformés en un <firstterm>code 
touche</firstterm> 
(<emphasis><firstterm>keycode</firstterm></emphasis>). Sur un système 
i386, en général, la touche <keycap>Backspace</keycap> émet 
<keycode>14</keycode> et la touche <keycap>Suppr</keycap> émet 
<keycode>111</keycode>.

</para> 
                </listitem>

                <listitem>
<para>

Les codes touche sont traduits par la bibliothèque clavier en un 
<firstterm>symbole clavier</firstterm> (<firstterm><emphasis>keyboard 
symbol&nbsp;: keysym</emphasis></firstterm>) eu moyen de la définition 
du clavier chargée par l'utilisateur. Si vous regardez dans votre base 
de données de clavier (par exemple dans <filename>/lib/kbd/</filename>), 
vous découvrirez plusieurs définitions pour plusieurs ordinateurs, 
différentes répartitions et probablement différentes interprétations des 
mêmes touches (par exemple, on peut vouloir que les deux touches 
<keycap>Alt</keycap> se comportent vraiment comme deux modificateurs 
distincts). La répartition du clavier de la console Linux assigne la 
touche symbolique <keysym>Suppr</keysym> au code touche 14 et la touche 
symbolique <keysym>Remove</keysym>au code touche 111. Cela peut sembler 
étrange, mais la console Linux émule un terminal VT100, et c'est ainsi 
que vont les choses ici-bas. <footnote><para>Cette affirmation a été 
confirmée et discutée plusieurs fois dans les commentaires sur ce 
document. Si vous avez quelque information décisive à ce sujet, prière 
de m'écrire.</para></footnote>

</para> 
                </listitem>

                <listitem>
<para>

Notre voyage touche déjà à sa fin. Les applications en console lisent 
des séquences <acronym>ASCII</acronym>, pas des touches symboliques. La 
console doit donc lire des touches symboliques et les traduire en des 
séquences <acronym>ASCII</acronym> chiffrant convenablement les touches. 
Bien sûr, cette opération doit être effectuée d'une manière qui soit 
compréhensible par les applications. En l'occurrence, dans la console 
Linux, la touche symbolique <keysym>Suppr</keysym> est mappée vers le 
code <acronym>ASCII</acronym> 127 (<symbol>DEL</symbol>), la touche 
symbolique <keysym>Remove</keysym> vers une séquence d'échappement 
adéquate, et la touche symbolique <keysym>BackSpace</keysym> vers le 
code <acronym>ASCII</acronym> 8 (<symbol>BS</symbol>).

</para> 
                </listitem>

                <listitem>
<para>

Enfin, nous devons en quelque sorte revenir sur nos pas et traduire les 
séquences <acronym>ASCII</acronym> générées par chaque touche en 
capabilité de touche. Cet objectif est atteint par une <firstterm>base 
de données de terminal</firstterm>, qui contient, pour chaque type de 
terminal, le mappage inversé des séquences de caractères vers les 
capabilités de touche (qui sont essentiellemnt un sous-ensemble des 
touches symboliques). <footnote><para>Certains programmes s'en remettent 
au pilote du terminal pour l'édition de la ligne d'entrée, comme 
l'effacement de caractères ou de mots. Avec <command>stty</command>, 
vous pouvez dire au pilote du terminal quel caractère il doit utiliser 
pour effacer le caractère placé à gauche du curseur (le caractère 
<firstterm>erase</firstterm>). Vous pouvez contrôler vos paramètres 
courants avec <command>stty a</command> et les choisir avec 
<command>stty erase 
<replaceable>character</replaceable></command>.</para> </footnote>

</para>  

<note>
<para>

Malheureusement, il y a deux bases de données de terminal 
<quote>standard</quote>, <application>termcap</application> et 
<application>terminfo</application>. Selon votre distribution, vous 
pouvez tout aussi bien utiliser l'une de ces deux là, ou la base de 
donnés peut encore dépendre de l'application. Nos explications se 
concentreront sur la base de données 
<application>terminfo</application>, qui est plus récente, mais les 
réglages suggérés ici prennent les deux en considération.

</para></note>

<para>

En l'occurrence, dans la console Linux, <keycap>F1</keycap> génère un 
échappement suivi de <literal>[[A</literal>, qui peut être traduit par 
la capabilité <literal>key_f1</literal> en regardant dans l'entrée de la 
base de données du terminal de la console (essayez <command>infocmp 
linux</command> si vous voulez regarder l'entrée). On peut trouver une 
très bonne explication des bases de données du terminal dans le manuel 
du <application>termcap</application> de <acronym>GNU</acronym>. En 
général, les applications Linux utilisent la base de données 
<application>terminfo</application>, plus récente, contenue dans le 
paquetage <application>ncurses</application>.

</para>

<para>

D'une façon qui n'est peut-être pas si étonnante, l'entrée de terminfo 
en console Linux mappe <symbol>DEL</symbol> vers la capabilité 
<literal>kbs</literal> (touche backspace), et Échap suivi de 
<literal>[3~</literal> vers la capabilité <literal>kdch1</literal> 
(touche <quote>delete-one-char</quote>). Même si vous pouvez trouver 
étrange que la touche <keycap>Backspace</keycap> émette un 
<symbol>DEL</symbol>, la base de données de terminal remet tout à sa 
place, et les applications qui se comportent correctement interpréteront 
<symbol>DEL</symbol> comme la capabilité <literal>kbs</literal>, 
effaçant ainsi le caractère situé à gauche du curseur.

</para> 
</listitem>
</orderedlist>
  </sect1>

  <sect1 id="why">
<title>Pourquoi ça ne marche pas (toujours)
</title> 

<para>

J'espère qu'au point où nous en sommes, le problème de base est clair&nbsp;: 
il y a un goulet d'étranglement entre le clavier et les applications 
console, à savoir, le fait qu'ils ne puissent communiquer que par 
séquences <acronym>ASCII</acronym>. Les touches spéciales sont ainsi 
d'abord traduites de touches symboliques en séquences, puis de séquences 
en capabilités de touche. Comme des consoles différentes ont des idées 
divergentes sur l'aspect que doit prendre cette traduction, nous avons 
besoin d'une base de données de terminal. Le système marcherait 
parfaitement, à un petit problème près&nbsp;: la base de données n'est pas 
toujours configurée correctement, et tout le monde ne l'utilise pas.

</para>

<para>

Les applications peuvent avoir un moyen de savoir quelle entrée de base 
de données utiliser&nbsp;: ce qui le rend réalisable, c'est une configuration 
adéquate de la variable d'environnement <envar>TERM</envar>. Dans 
certains cas, il y a une dissonnance entre l'émulateur de terminal et le 
contenu de l'entrée de la base de données suggérée par 
<envar>TERM</envar>.

</para> 

<para>

En outre, de nombreuses applications <emphasis>n'utilisent 
pas</emphasis> la base de données de terminal (ou au moins pas 
entièrement), et considèrent les codes <acronym>ASCII</acronym> 
<symbol>BS</symbol> et <symbol>DEL</symbol> avec un sens qu'elles ne 
font que présumer&nbsp;: par conséquent, sans regarder dans la base de 
données, elles leur assignent une signification (en général, bien sûr, 
la signification est d'effacer le caractère situé avant ou sous le 
curseur). Ainsi notre beau schéma est complètement détruit (tout 
utilisateur de Linux en fait l'amère expérience). En l'occurrence, 
<application>bash</application> suppose que <symbol>DEL</symbol> doit 
faire un <action>backward-delete-char</action>, c'est-à-dire backspace.

</para>
<para>

Partant, tout fraîchement installé, il permet que la touche 
<keycap>Backspace</keycap> fonctionne en console comme on peut s'y 
attendre, mais uniquement à cause de la succession de deux renversements 
! Bien sûr, la touche <keycap>Suppr</keycap> ne fonctionne pas. La cause 
de ce phénomène est que <application>bash</application> ne cherche pas 
dans la base de données de terminal la capabilité 
<literal>kdch1</literal>.

</para>  

<para>

Juste pour illustrer la façon dont les choses se sont embrouillées, 
considérez le script <command>fix_bs_and_del</command> fourni avec la 
distribution Red Hat (et peut-être d'autres). Il assigne à la volée la 
touche symbolique <keysym>BackSpace</keysym> à la touche 
<keycap>Backspace</keycap>, et la touche symbolique 
<keysym>Suppr</keysym> à la touche <keycap>Suppr</keycap>. Désormais le 
shell fonctionne&nbsp;! Malheureusement, tous les programmes qui se 
reposaient sur l'association correcte de la génération de touches 
symboliques et de mappages de la base de données de terminal ne marchent 
plus du tout maintenant, car la touche symbolique <keysym>Suppr</keysym> 
est mappée par la base de données terminfo vers <symbol>DEL</symbol>, et 
celui-ci vers la capabilité de touche <literal>kbs</literal>, de telle 
sorte que dans de tels programmes, les deux touches produisent un 
backspace.

</para>

  </sect1>

  <sect1 id="X">
<title>X</title>

<para>

Sous X, la situation n'est pas vraiment différente. Il y a juste une 
couche différente, à savoir que le système X Window traduit les 
scancodes en ses propres touches symboliques, qui sont bien plus variées 
et plus précises que celles de la console, et les fournit aux 
applications (au fait, c'est la raison pour laquelle 
<application>XEmacs</application> n'est pas tourmenté par ce problème&nbsp;: 
X traduit le code touche 22 par la touche symbolique 
<keysym>BackSpace</keysym> et le code touche 107 par la touche 
symbolique <keysym>Suppr</keysym>, puis l'utilisateur peut facilement 
assigner à ces touches symboliques le comportement désiré). Bien sûr, un 
programme d'émulation de terminal (en général un émulateur de VT100 dans 
le monde X) doit traduire les touches symboliques X en séquences ASCII, 
de telle sorte que nous en revenons à notre douloureuse affaire.

</para> 

<para>

Plus précisément, en général <application>xterm</application> se 
comporte exactement comme la console (i.e. il émet les mêmes séquences 
<acronym>ASCII</acronym>), mais, par exemple, 
<application>gnome-terminal</application> dans la Red Hat &lt;7.0 or 
&ge;7.1 émet <symbol>BS</symbol> pour <keycap>Backspace</keycap> et 
<symbol>DEL</symbol> pour <keycap>Suppr</keycap>. Là où ça commence à 
devenir drôle, c'est quand vous vous rendez compte qu'ils utilisent par 
défaut la <emphasis>même</emphasis> entrée de base de donnée de terminal 
; ainsi, le fait que la capabilité <literal>kbs</literal> soit associée 
à un <symbol>DEL</symbol> <acronym>ASCII</acronym> fait que toutes les 
applications qui se comportent correctement produisent le même 
comportement pour les touches <keycap>Backspace</keycap> et 
<keycap>Suppr</keycap> dans <application>gnome-terminal</application>. 
La simple commande

</para>

<screen>
bash$ export TERM=gnome
</screen> 

<para>

peut résoudre le problème, dans ce cas, pour les applications qui se 
comportent correctement. Bon, pas toujours, parce qu'il pourrait manquer 
une entrée appelée <literal>gnome</literal> à votre système dans la base 
de données de terminal, en particulier s'il n'est pas parfaitement à 
jour.

</para> 

<para>

Dans certains cas, ce n'est pas toujours une solution&nbsp;: si, par exemple, 
vous avez une distribution Red Hat 7.0, votre 
<application>gnome-terminal</application> se comporte comme une console. 
Mais attention&nbsp;: si vous avez mis à jour votre bureau en utilisant la 
distribution Helix, alors, votre 
<application>gnome-terminal</application> se comporte comme une Red Hat 
antérieure à la version 7.0.

</para>

<para>

À la seule fin de faciliter la compréhension de ce qui va suivre, 
appelons <firstterm>standard</firstterm> un émulateur de VT100 se 
comportant comme la console, et <firstterm>non-standard</firstterm> un 
qui émet <symbol>BS</symbol> pour <keycap>Backspace</keycap> et 
<symbol>DEL</symbol> pour <keycap>Suppr</keycap><footnote><para>Même ces 
définitions ont été confirmées et discutées de nombreuses fois au sujet 
de ce document. Si vous avez une information décisive sur ce sujet, vous 
êtes prié de m'écrire.</para></footnote>.

</para>

<para>

Ainsi, par exemple, <application>xterm</application> a toujours été 
standard dans la distribution Debian, tandis qu'il a oscillé à de 
nombreuses reprises entre les états standard et non-standard dans la Red 
Hat&nbsp;; le comportement de <application>gnome-terminal</application> est 
encore plus erratique. Voir <xref linkend="morehack"/> pour quelques 
renseignements sur la façon de rendre standard un terminal non-standard.

</para>


</sect1>
  
<sect1 id="writing">

<title>Ce que vous devriez faire quand vous écrivez des 
applications</title>

<para>

Lorsque vous écrivez une application en console, soyez gentils pour 
l'utilisateur et essayez de comprendre ce qui vient de l'entrée standard 
au moyen de la procédure de restauration suivante&nbsp;:
 
</para>

<orderedlist>

<listitem><para>

ouvrez la bonne entrée <application>terminfo</application> et essayez de 
traiter la séquence afin de découvrir si elle a une signification 
particulière dans le terminal courant&nbsp;; si c'est le cas, utilisez 
la sémantique <application>terminfo</application>&nbsp;;

</para></listitem>

<listitem><para>

utilisez la signification <acronym>ASCII</acronym> voulue sur les 
contenus de ligne, les retours chariot, les tabulations et, bien sûr, 
<symbol>BS</symbol> et <symbol>DEL</symbol>. Croiser les doigts pourrait 
également se révéler utile.

</para></listitem>

</orderedlist>

  </sect1>

  <sect1 id="system">

<title>

    Ce que vous devriez faire sur votre système

</title> 

<para>

Remarquez encore que le problème qui égare souvent les gens qui essayent 
de régler leur système est qu'il règlent les choses au mauvais endroit. 
Puisque les parties qui fonctionnent ne fonctionnent souvent que par 
chance, essayer de régler le système en supposant que quelque chose est 
cassé mènera souvent à changer des paramètres corrects en paramètres 
incorrects.

</para> 

<sect2>
<title>Ce qui doit être fait</title>

<sect3 id="deviance">
<title>La détection des comportements non-standards
</title>  

<para>

La première étape d'une solution propre est de savoir exactement quels 
terminaux sont standards et lesquels ne le sont pas. En général, ils se 
comportent tous comme la console, et dans ce cas les modifications à 
faire pour que tout fonctionne bien sont minimes. Si, cependant, vous 
avez un terminal non-standard (par exemple, une version non-standard de 
<application>gnome-terminal</application>), vous aurez à le traiter 
d'une façon spécifique.

</para> 

<para>

Le programme suivant, composé d'une ligne de C,

</para>

<programlisting width="70">
void main(void) {int c; while(c = getchar()) printf("%d 0x%02X\n", c, c);}
</programlisting>

<para>

pourrait vous aider. Mettez cette ligne dans un fichier intitulé 
<filename>ascii.c</filename>, compilez-le avec <command>gcc ascii.c -o 
ascii</command>, tapez <command>./ascii</command> et appuyez sur une 
touche suivie de <keycap>Entrée</keycap>. Le programme affichera les 
codes décimal et hexadécimal de la séquence <acronym>ASCII</acronym> 
produite (vous pourriez d'abord vouloir faire un <command>stty erase 
^-</command> pour obtenir vraiment tous les codes). Vous pouvez 
désormais voir facilement ce que la touche <keycap>Backspace</keycap> 
fait&nbsp;: si elle émet un <symbol>DEL</symbol> (127), vous avez un 
émulateur standard, si elle émet un <symbol>BS</symbol> (8), vous en 
avez un non-standard.

</para>
</sect3>

<sect3>
<title>Distinguer les émulateurs
</title>  

<para>

Si vous avez un émulateur de terminal non-standard, vous devez le 
distinguer des émulateurs standards. Théoriquement, cela ne devrait pas 
être un problème parce qu'il y a différentes entrées dans la base de 
données de terminal avec différentes séquences (l'entrée utilisée dépend 
de la valeur de la variable <envar>TERM</envar>).

</para>  

<para>

Nous en venons ici au fait que l'entrée <literal>gnome</literal> doit 
être utilisée pour tous les émulateurs de VT100 non-standards, et 
l'entrée<literal>xterm</literal> pour les émulateurs standards. C'est 
avec de nombreuses distributions (sauf quelques cas comme la Red Hat 
&le;5.0, où l'entrée <literal>xterm</literal> est non-standard).

</para> 

<para>

Cependant, <application>gnome-terminal</application> utilise par défaut 
la même entrée que <application>xterm</application>&nbsp;; ainsi, si 
l'un est non-standard et que l'autre est standard, vous devrez trouver 
un moyen de le leur dire séparément. L'option 
<literal>termname</literal> de <application>gnome-terminal</application> 
permet à l'utilisateur de choisir la variable <envar>TERM</envar>. 
Cependant, dans d'anciennes versions de 
<application>gnome-terminal</application>, l'option ne fonctionne pas. 
En outre, il n'est parfois pas facile de modifier la façon dont 
<application>gnome-terminal</application> est démarré.

</para> 

<para>

C'est une bonne idée que d'exploiter ici le fait que 
<application>gnome-terminal</application> règle la variable 
<envar>COLORTERM</envar> sur <literal>gnome-terminal</literal>. Ainsi, 
par le simple ajout d'un test aux fichiers de configuration du shell, 
nous pouvons régler la variable <envar>TERM</envar>.

</para> 
</sect3>

<sect3>
<title>Réglage des bases de données de terminal
</title> 

<para>

Notre problème est désormais qu'il pourrait manquer à la base de données 
de terminal une entrée <literal>gnome</literal> pour les terminaux non 
standards (c'est le cas dans un certain nombre de versions de 
<application>termcap</application> et de 
<application>terminfo</application>). Les bases de données 
<application>terminfo</application> récentes ont une entrée 
<literal>gnome</literal>, mais, dans certains cas, comme 
<application>gnome-terminal</application> se comporte dans l'ensemble 
comme <application>xterm</application>, à nos deux fameuses touches 
près, il est possible de générer automatiquement une entrée flambant 
neuve et correcte.

</para> 

</sect3>

<sect3>
<title>Réglage du comportement du shell
</title> 

<para>

La bibliothèque <application>readline</application>, utilisée par 
<application>bash</application> et de nombreux autres programmes pour 
lire la ligne d'entrée, peut être personnalisée de façon à reconnaître 
les séquances spécifiques de caractères. La personnalisation peut 
également dépendre de la variable <envar>TERM</envar>, si bien qu'une 
fois que l'on peut distinguer les terminaux, on peut régler finement le 
clavier.

</para> 
<para>

Par ailleurs, si vous voulez que <application>less</application> et 
autres applications en mode texte marchent correctement, vous devez 
convaincre le shell du fait que sous un émulateur de terminal 
non-standard, le caractère d'effacement soit <symbol>BS</symbol>, et pas 
<symbol>DEL</symbol> (dans le cas contraire, la touche 
<keycap>Backspace</keycap> émet déjà <symbol>DEL</symbol>, donc nous 
n'avons rien à faire). On peut le faire à l'aide de la commande 
<command>stty</command>.

</para> 
</sect3>

</sect2>

<sect2>
<title>Comment le faire</title>

<caution><para>

Ces réglages peuvent avoir quelques effets pervers. D'abord, ils ne 
marchent que pour les terminaux spécifiés. Ensuite, en théorie (mais il 
est peu probable que cela arrive) ils pourraient embrouiller la 
bibliothèque <application>readline</application> sur d'autres terminaux. 
Mais ces deux limitations sont en général sans inoffensives.

</para></caution>

<para>

Tout d'abord, vérifiez avec <command>infocmp gnome</command> si vous 
avez déjà une entrée <literal>gnome</literal> dans votre base de données 
<application>terminfo</application> (nous réglerons plus tard le cas de 
<application>termcap</application>). Si l'entrée n'existe pas, la 
commande suivante

</para>

<programlisting>
bash$ tic &lt;(infocmp xterm |\
sed 's/xterm|/gnome|/' |\
sed 's/kbs=\\177,/kbs=^H,/' |\
sed 's/kdch1=\\E\[3~,/kdch1=\\177,/')
</programlisting>

<para>

en créera une correcte dans <filename>~/.terminfo</filename>. Si la même 
commande est lancée par l'administrateur, elle générera l'entrée dans la 
base de données globale (vous pouvez transgresser ce comportement en 
réglant <envar>TERMINFO</envar> sur <filename>~/.terminfo</filename>). 
Notez que si votre entrée <literal>xterm</literal> est déjà non-standard 
(par exemple, vous avez une Red Hat &le;5.0), le script la copiera sans 
la changer, et c'est précisément ce que nous voulons.

</para> 

<para>

Ajoutez maintenant le fragment suivant à 
<filename>~/.inputrc</filename><footnote id="addinputrc"><para> Sur les 
anciennes versions de <application>bash</application>, vous devez vous 
souvenir de régler correctement <envar>INPUTRC</envar>, par exemple en 
ajoutant

</para>

<programlisting>
export INPUTRC=~/.inputrc
</programlisting> 

<para>

à votre <filename>~/.profile</filename> (ou au fichier, quel qu'il soit, 
qui n'est lu que par les shells de login).

</para></footnote>&nbsp;:

</para>

<programlisting>
"\e[3~": delete-char
</programlisting>

<para>

Cette commande apprend à la bibliothèque 
<application>readline</application> comment gérer votre touche standard 
<keycap>Suppr</keycap> pour des émulateurs standards, et avec un peu de 
chance, cela ne devrait pas interférer avec d'autres terminaux. 
Cependant, nous devons maintenant expliquer à la bibliothèque la 
signification du caractère <symbol>DEL</symbol> dans les terminaux 
non-standards, en ajoutant par exemple

</para>

<programlisting>
$if term=gnome
DEL: delete-char
Meta-DEL: kill-word
"\M-\C-?": kill-word
$endif
</programlisting>

<para>

à <filename>~/.inputrc</filename>. Si <application>xterm</application> 
est non-standard également, vous devez ajouter trois autres lignes pour 
lui. Inversement, si tous les terminaux sont standards, cette partie 
n'est pas requise. Toutes ces modifications peuvent être étendues en 
changeant le fichier <filename>/etc/inputrc</filename>.

</para> 

<para>

Remarquez que les assignements conditionnels font que les terminaux 
non-standards fonctionnent <emphasis>pour autant que la variable 
<envar>TERM</envar> soit configurée correctement</emphasis>. Pour le 
garantir, il y a plusieurs techniques. D'abord, comme la valeur par 
défaut de la variable <envar>TERM</envar> est, pour 
<application>gnome-terminal</application>, <literal>xterm</literal>, si 
tous les terminaux sont standards, nous n'avons rien à faire. Si, 
cependant, un terminal qui utilise par défaut l'entrée 
<literal>xterm</literal> est non-standard, vous devez trouver un moyen 
de régler correctement la variable <envar>TERM</envar>&nbsp;; supposez 
par exemple que ceci est vrai de 
<application>gnome-terminal</application>.

</para> 

  <para>

Le moyen le plus simple d'obtenir cet effet est de démarrer 
<literal>--termname=gnome</literal>, par exemple en réglant correctement 
la ligne de commande dans le lanceur de la barre d'outils 
<acronym>GNOME</acronym>. Si vous avez cependant une version plus 
ancienne et que cette méthode ne fonctionne pas, vous pouvez ajouter les 
lignes

</para>   

<programlisting>
if [ "$COLORTERM" = "gnome-terminal" ]
then
export TERM=gnome
fi
</programlisting>

<para>

à votre fichier de configuration 
<filename>~/.bashrc</filename><footnote><para>Plus précisément, au 
fichier de configuration du shell qui est lu dans n'importe quel shell, 
pas seulement dans les shells de login. Le bon fichier dépend de la 
séquence de démarrage de votre 
<application>bash</application>.</para></footnote>. L'assignement n'est 
exécuté que sous <application>gnome-terminal</application>, et règle 
correctement la variable <envar>TERM</envar>.

</para>

<note><para>

Régler le terminal sur <literal>gnome</literal> pourrait empêcher 
<command>ls</command> d'utiliser des couleurs, car de nombreuses 
versions de <command>ls</command> ignorent que 
<application>gnome-terminal</application> supporte les couleurs. Afin 
d'éviter ce problème, créez un fichier de configuration 
<filename>~/.dircolors</filename> avec <command>dircolors 
--print-database &gt;~/.dircolors</command>, et ajoutez une ligne 
<userinput>TERM=gnome</userinput> au fichier de configuration.

</para></note> 

<para>

Nous allons maintenant générer à la volée une entrée 
<application>termcap</application> qui convienne pour les émulateurs de 
terminaux non-standards&nbsp;; on peut le faire comme suit, toujours 
dans <filename>~/.bashrc</filename>&nbsp;:

</para>

<programlisting>
if [ "$TERM" = "gnome" ]
then
export TERMCAP=$(infocmp -C gnome | grep -v '^#' | \
tr '\n\t' '  ' | sed 's/\\  //g' | sed s/::/:/g)
fi
</programlisting>

  <para>

Enfin, nous devons expliquer au périphérique de terminal quel caractère 
est généré par la touche d'effacement. Comme en général la touche 
d'effacement est supposée faire un retour arrière, il y a une astuce 
sympathique et efficace tirée du <filename>/etc/bashrc</filename> de Red 
Hat&nbsp;: ajoutez ceci à <filename>~/.bashrc</filename>&nbsp;:

</para> 

<programlisting>
KBS=$(tput kbs)
if [ ${#KBS} -eq 1 ]; then stty erase $KBS; fi
</programlisting>

<para>

C'est une idée toute simple&nbsp;: nous lisons la capabilité 
<literal>kbs</literal> à partir de la base de données de terminal, et 
réglons le caractère d'effacement sur sa valeur si c'est un caractère 
simple (ce qui est le cas aussi bien dans les terminaux standards que 
dans les non-standards).

</para> 

<note><para>

Certaines distributions peuvent avoir des réglages déjà en place dans le 
fichier de configuration <filename>/etc/inputrc</filename>, valable à 
l'échelle du système tout entier. Dans ce cas, vous pouvez éliminer les 
lignes redondantes de votre <filename>~/.inputrc</filename>.

</para></note>

</sect2>

<sect2>
<title>Réglage de <application>tcsh</application></title>

<para>

Dans le cas de <application>tcsh</application>, les réglages vont tous 
dans <filename>~/.tcshrc</filename>, et suivent la même logique que pour 
<application>bash</application>&nbsp;:

</para>

<programlisting width="80">
bindkey "^[[3~" delete-char

if ($?COLORTERM) then
   if ($COLORTERM == "gnome-terminal") then
  setenv TERM gnome
   endif
endif

if ($?TERM) then
   if ($TERM == "gnome") then
  setenv TERMCAP \
   "`infocmp -C gnome | grep -v '^#' | tr '\n\t' '  ' | sed 's/\\  //g' | sed s/::/:/g`"
  bindkey "^?" delete-char
  bindkey "^[^?" delete-word
  bindkey "\377" delete-word
   endif
endif

set KBS=`tput kbs`
if (${%KBS} == 1) then 
   stty erase $KBS
endif
</programlisting>

<para>

La seconde partie doit être répétée pour chaque terminal non-standard. 
Bien sûr, si une entrée <application>termcap</application> existe déjà, 
il n'est pas nécessaire de la générer.

</para>

</sect2>

  </sect1>


  <sect1 id="notwork">

<title>Que faire si rien ne marche</title>

<para>

La première chose à faire est de comprendre quels codes 
<acronym>ASCII</acronym> sont produits par une certaine touche utilisant 
le <link linkend="deviance">programme d'une ligne de C</link>.

</para>

<para>

Une fois que vous savez quelles séquences sont produites, vous devez 
vérifier l'entrée <application>terminfo</application> en cours avec 
<command>infocmp</command> (ne soyez pas effrayé par la somme des 
informations affichées&nbsp;!) et assurez-vous que les capabilités 
<literal>kbs</literal> et <literal>kdch1</literal> correspondent aux 
bonnes séquences (c'est-à-dire celles produites par les touches 
respectives). En outre, vous devez vérifier avec <command>stty 
-a</command> que le caractère d'effacement est celui qui est émis par la 
touche <keycap>Backspace</keycap> (remarquez que <literal>^H</literal> 
représente <symbol>BS</symbol> tandis que <literal>^?</literal> 
représente <symbol>DEL</symbol>).

</para> 

<para>

S'il y a dissonnance, il peut y avoir plusieurs raisons&nbsp;: mauvais 
contenu de la variable <envar>TERM</envar>, mauvaise entrée de la base 
de données de terminal, mauvaise émulation de terminal sous X. J'espère 
qu'arrivé à ce point, vous avez suffisamment d'informations pour creuser 
la solution par vous-même.

</para> 

<note><para>

Si différentes applications se comportent différemment, il est possible 
que certaines d'entre elles utilisent correctement la base de données de 
terminal, et d'autres non. Rappelez-vous que le fait que les touches 
adoptent le bon comportement dans une application donnée ne signifie pas 
que l'application utilise correctement la base de données de 
terminal&mdash; elles peuvent ne fonctionner que par chance. Si vous 
voulez avoir une vérification indépendante, vous pouvez essayer de voir 
si l'éditeur <ulink 
url="http://ne.dsi.unimi.it/"><command>ne</command></ulink> fonctionne 
ou non. <command>ne</command> utilise toutes les capabilités du 
terminal, y compris <literal>kbs</literal> et <literal>kdch1</literal>, 
et n'utilise la signification désirée qu'en dernier recours.

</para></note>

  </sect1>

  <sect1 id="morehack">
<title>Plus de bidouillage</title>

<para>

Ainsi, vous n'êtes pas satisfait par toutes ces informations. Dans ce 
cas, vous pouvez faire encore plus de bidouillage sur la sortie de 
Backspace et de Suppr, en ayant recours aux commandes qui conviennent 
pour observer ou régler la façon dont X et la console traitent les 
touches.

</para> 

<para>

Il peut arriver que, pour quelque raison, ce que j'ai dit sur <link 
linkend="X">X</link> ne soit pas vrai, c'est-à-dire que X ne traduise 
<emphasis>pas</emphasis> le code touche 22 en touche symbolique 
<keysym>BackSpace</keysym>, ni le code touche 107 en touche symbolique 
<keysym>Suppr</keysym> (ou même que, sur votre clavier particulier, les 
codes touche associés à <keycap>Backspace</keycap> et 
<keycap>Suppr</keycap> ne soient pas 22 et 107). Afin de vous en 
assurer, vous devez utiliser <command>xev</command>, une application X 
simple qui affichera le code touche et la touche symbolique associés à 
la touche que vous enfoncez. Si quelque chose va de travers, il y a 
plusieurs façons de régler le problème&nbsp;: le moyen simple et 
provisoire est d'utiliser <command>xmodmap</command>, une commande qui 
vous permet de changer de nombreux réglages relatifs au traitement du 
clavier par X. Par exemple,

</para>

<screen>
xmodmap -e "keycode 22 = BackSpace"
xmodmap -e "keycode 107 = Delete"
</screen>

<para>

réglera correctement les touches symboliques (en supposant que 22 et 107 
sont les codes touches corrects pour vous). Dans le cas où vous voudriez 
opérer quelques modifications sur le long terme, vous pouvez jouer avec 
les ressources <varname>vt100.backArrowKey</varname>, 
<varname>vt100.translations</varname> et <varname>ttyModes</varname> de 
<application>xterm</application> (et les applications de terminal 
similaires) dans le fichier de configuration 
<filename>~/.Xdefaults</filename>. Une possibilité, par exemple, 
consiste en ceci&nbsp;:

</para>

<programlisting>
XTerm.VT100.Translations: \
&lt;Key>BackSpace: string(0x7F)\n\
&lt;Key>Delete:string("\033[3~")
</programlisting>

<para>

Vous devriez jeter un coup d'&oelig;il dans la page de manuel de
<application>xterm</application> pour obtenir plus d'informations.

</para> 

<para>

Le programme faisant pour la console ce que <command>xev</command> fait 
pour X est <command>showkeys</command>&nbsp;: il renverra les codes 
touche de console des touches que vous enfoncez. En combinant 
<command>showkeys</command> avec <command>dumpkeys</command>, qui 
affichera sur la sortie standard le mappage clavier de la console, vous 
pouvez facilement régler les dissonnances entre les codes touche et les 
touches symboliques. Parallèlement à <command>xmodmap</command>, 
<command>loadkeys</command> peut ensuite régler des associations 
isolées, ou charger des mappages clavier entièrement nouveaux. Avec 
cela, vous pouvez même changer la chaîne associée à une touche 
symbolique donnée. Si vous voulez enregistrer ces modifications, vous 
devrez définir un nouveau mappage clavier pour la console (vous devriez 
jeter un coup d'&oelig;il sur les mappages clavier du système, en 
général situés dans <filename>/lib/kbd</filename>).

</para> 

  </sect1>

  <sect1 id="concl">
<title>Conclusions</title>

<para>

Les réglages suggérés ici devraient résoudre une grande étendue de 
problèmes liés à l'effacement du texte que vous avez écrit (cependant, 
ils n'aident pas à en créer du nouveau <literal>:)</literal>).

</para> 

<para>

Il y a un petit bug dans le réglage tout entier&nbsp;: si vous utilisez 
l'astuce du <envar>COLORTERM</envar> et que vous démarrez 
<application>xterm</application> depuis 
<application>gnome-terminal</application>, le premier verra 
<envar>TERM</envar> se régler sur <literal>gnome</literal>. Cet 
inconvénient est, bien sûr, en général complètement inoffensif, et n'a 
pas lieu si vous avez tout simplement démarré 
<application>gnome-terminal</application> avec un <envar>TERM</envar> 
convenablement réglé.

</para>

<para>

Un autre problème non trivial, et qui n'a pas vraiment de solution, est 
celui qui concerne la connexion à distance&nbsp;: si vous vous connectez 
sur un hôte dont la base de données de terminal est incohérente avec la 
vôtre, vous aurez à configurer les choses à la main.
 
</para>

<para>

Enfin, il faut observer que les réglages ne marcheront pas pour des 
applications cassées (par exemple, des applications ignorant la 
capabilité de touche <literal>kbs</literal>). Il n'y a pas grand chose à 
faire dans ce cas, car régler le problème d'une application cassée 
présente de fortes chances de casser toutes celles qui se comportent 
correctement.

</para>

  </sect1>

</article>