Comment changer le titre d'un xterm
 Ric Lister, [email protected]
 traduction Jean-Albert Ferrez, [email protected]
 Derni�re modification : 22.11.1999, v2.0

 Ce document explique comment utiliser des s�quences d'�chappement pour
 modifier dynamiquement le titre de la fen�tre et de l'ic�ne d'un
 xterm. Des exemples sont donn�s pour plusieurs shells, et l'annexe
 donne les s�quences pour d'autres types de terminaux.
 ______________________________________________________________________

 Table des mati�res


 1. O� trouver ce document

 2. Titres statiques

 3. Titres dynamiques

    3.1 Les s�quences d'�chappement xterm
    3.2 Afficher les s�quences d'�chappement

 4. Exemples pour quelques shells

    4.1 zsh
    4.2 tcsh
    4.3 bash
    4.4 ksh
    4.5 csh

 5. Afficher le nom de la commande en cours d'ex�cution

    5.1 zsh
    5.2 Autres shells

 6. Annexe : s�quences d'�chappement pour d'autres �mulateurs de terminaux

    6.1 (TT
    6.2 (TT
    6.3 (TT
    6.4 CDE dtterm
    6.5 HPterm

 7. Annexe : exemples dans d'autres langages

    7.1 C
    7.2 Perl

 8. Cr�dits



 ______________________________________________________________________

 11..  OO�� ttrroouuvveerr ccee ddooccuummeenntt

 Ce document fait d�sormais partie des HOWTOs Linux
 <http://sunsite.unc.edu/LDP/HOWTO/> et peut �tre trouv� � :
 <http://sunsite.unc.edu/LDP/HOWTO/mini/Xterm-Title.html>.


 La derni�re version en date se trouve � :
 <http://www.giccs.georgetown.edu/~ric/howto/Xterm-Title/>.


 Ce document remplace le howto initial �crit par Winfried Tr�mper.


 Ndt : La version fran�aise de ce document se trouve � :
 <http://www.freenix.fr/linux/HOWTO/mini/Xterm-Title.html>


 22..  TTiittrreess ssttaattiiqquueess

 Les titres des �mulateurs de terminaux xterm, color-xterm ou rxvt
 peuvent �tre donn�s sur la ligne de commande avec les options -T et
 -n :



      xterm -T "Le titre de mon XTerm" -n "Le titre de son ic�ne"





 33..  TTiittrreess ddyynnaammiiqquueess

 Bon nombre de personnes trouvent utile de faire appara�tre dans le
 titre de leur terminal une information qui change dynamiquement, telle
 que le nom du serveur sur lequel on est connect�, le r�pertoire
 courant, etc.


 33..11..  LLeess ss��qquueenncceess dd''��cchhaappppeemmeenntt xxtteerrmm

 On peut changer le titre de la fen�tre et de l'ic�ne dans un xterm
 lanc� en utilisant les s�quences d'�chappement XTerm. Les s�quences
 suivantes sont utiles dans ce but :

 �  ESC]0;nnoommBEL -- Change le titre de la fen�tre et de l'ic�ne

 �  ESC]1;nnoommBEL -- Change le titre de l'ic�ne

 �  ESC]2;nnoommBEL -- Change le titre de la fen�tre

 o� ESC est le caract�re escape (�chappement, \033), et BEL est le
 caract�re bell (bip, \007).


 Afficher l'une de ces s�quences dans un xterm causera le changement du
 titre de la fen�tre ou de l'ic�ne.


 NNoottee: Ces s�quences fonctionnent �galement avec la plupart des d�riv�s
 de xterm, tels que nxterm, color-xterm et rxvt. D'autres �mulateurs de
 terminaux utilisent d'autres s�quences ; quelques exemples sont donn�s
 en annexe. La liste compl�te des s�quences d'�chappement est donn�e
 dans le fichier ctlseq2.txt
 <http://www.giccs.georgetown.edu/~ric/howto/Xterm-Title/ctlseq2.txt>
 de la distribution de xterm, ou dans le fichier xterm.seq
 <http://www.giccs.georgetown.edu/~ric/howto/Xterm-Title/xterm.seq> de
 la distribution de rxvt <http://www.rxvt.org/>.


 33..22..  AAffffiicchheerr lleess ss��qquueenncceess dd''��cchhaappppeemmeenntt

 Pour les informations qui ne changent pas au cours de l'�x�cution du
 shell, telles que le serveur et le nom d'utilisateur, il suffit
 d'afficher les s�quences depuis le fichier rc du shell :

 echo -ne "\033]0;${USER}@${HOST}\007"




 devrait donner un titre du genre nom@serveur, pour autant que les
 variables $USER et $HOST soient correctes. Les options requises pour
 echo peuvent d�pendre du shell (cf ci-dessous).


 Pour les informations qui peuvent changer au cours de l'ex�cution du
 shell, telles que le r�pertoire courant, ces s�quences doivent
 vraiment �tre donn�es lors de chaque changement de l'invite.  De cette
 fa�on, le titre est mis � jour lors de chaque commande et peut ainsi
 refl�ter des informations telles que le r�pertoire en cours, le nom
 d'utilisateur, le nom du serveur, etc. Certains shells offrent des
 fonctions sp�ciales pour y parvenir, d'autres pas : il faut dans ce
 cas ins�rer la cha�ne directement dans le texte de l'invite.


 44..  EExxeemmpplleess ppoouurr qquueellqquueess sshheellllss

 Nous donnons ci-dessous des exemples pour les shells les plus
 courants. Nous commen�ons avec zsh car il offre des possibilit�s qui
 facilitent grandement notre t�che. Nous progresserons ensuite vers des
 exemples de plus en plus difficiles.


 Dans tous les exemples ci-dessous, on teste la variable
 d'environnement TERM pour �tre certain de n'appliquer ces s�quences
 que si l'on est dans un xterm (ou d�riv�). Le test est fait sur
 TERM=xterm*, de mani�re � inclure au passage les variantes telles que
 TERM=xterm-color (d�fini par rxvt).


 Encore une remarque au sujet des d�riv�s du C shell tels que tcsh et
 csh. Dans ces shells, les variables non-d�finies causent des erreurs
 fatales. Il est d�s lors n�cessaire avant de tester la valeur de la
 variable $TERM, de tester si elle existe pour ne pas interrompre un
 shell non-interactif. Pour y parvenir, il faut inclure les exemples
 ci-dessous dans quelque chose du genre :


        if ($?TERM) then
            ...
        endif




 (� notre avis, il s'agit d'une raison parmi beaucoup d'autres de ne
 pas utiliser les C shells. Voir _C_s_h _P_r_o_g_r_a_m_m_i_n_g _C_o_n_s_i_d_e_r_e_d _H_a_r_m_f_u_l
 _<http://language.perl.com/versus/csh.whynot> pour une discussion
 utile).


 Pour utiliser les exemples suivants, placez-les dans le fichier
 d'initialisation du shell apropri�, c'est-�-dire un fichier lu lors du
 lancement d'un shell interactif. Le plus souvent il s'agit de ._s_h_e_l_lrc
 (ex : .zshrc, .tcshrc, etc.)






 44..11..  zzsshh

 On utilise quelques fonctions et codes offerts par zsh :


      precmd ()   fonction ex�cut�e juste avant chaque invite
      chpwd ()    fonction ex�cut�e lors de chaque changement de r�pertoire
      \e          code du caract�re escape (ESC)
      \a          code du caract�re bip (BEL)
      %n          code remplac� par $USERNAME
      %m          code remplac� par le hostname jusqu'au premier '.'
      %~          code remplac� par le r�pertoire, avec '~' � la place de $HOME




 De nombreux autres codes sont disponibles, voir 'man zshmisc'.


 Ainsi, le code suivant, mis dans ~/.zshrc, affiche
 "nom@serveur:r�pertoire" dans le titre de la fen�tre (et de l'ic�ne).


      case $TERM in
         xterm*)
             precmd () {print -Pn "\e]0;%n@%m: %~\a"}
             ;;
      esac




 On arrive au m�me r�sultat en utilisant chpwd() au lieu de precmd().
 La commande interne print fonctionne comme echo, mais donne acc�s aux
 s�quences %.



 44..22..  ttccsshh

 tcsh offre des possibilit�s similaires � celles de zsh :


      precmd ()   fonction ex�cut�e juste avant chaque invite
      chpwd ()    fonction ex�cut�e lors de chaque changement de r�pertoire
      %n          code remplac� par $USERNAME
      %m          code remplac� par le hostname jusqu'au premier '.'
      %~          code remplac� par le r�pertoire, avec '~' � la place de $HOME





 Malheureusement, il n'y a pas d'�quivalent � la fonction print de zsh
 qui permette d'utiliser les codes de l'invite dans la cha�ne du
 titre ; le mieux que l'on puisse faire est d'utiliser les variables du
 shell (dans ~/.tcshrc) :


      switch ($TERM)
         case "xterm*":
             alias precmd 'echo -n "\033]0;${HOST}:$cwd\007"'
             breaksw
      endsw


 mais on obtient alors le chemin complet du r�pertoire, sans '~'. Par
 contre, on peut mettre la cha�ne dans l'invite :


      switch ($TERM)
         case "xterm*":
             set prompt="%{\033]0;%n@%m:%~\007%}tcsh%# "
             breaksw
         default:
             set prompt="tcsh%# "
             breaksw
      endsw




 ce qui donne "tcsh% " comme invite, et "_n_o_m@_s_e_r_v_e_u_r: _r_�_p_e_r_t_o_i_r_e" dans
 le titre (et l'ic�ne) de xterm. Les "%{...%}" doivent �tre plac�s
 autour des s�quences d'�chappement (et ne peuvent pas �tre le dernier
 �l�ment de l'invite, 'man tcsh' donne plus de d�tails).



 44..33..  bbaasshh

 bash offre la variable PROMPT_COMMAND qui contient une commande �
 ex�cuter avant d'afficher l'invite. Ce code (ins�r� dans ~/.bashrc)
 affiche nom@serveur: r�pertoire dans le titre de la fen�tre (et de
 l'ic�ne).


      PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'




 o� \033 est le caract�re ESC et \007 BEL.


 Il convient de noter que les guillemets jouent un r�le important : les
 variables entre "..." sont �valu�es, alors que celles entre "..." ne
 le sont pas. Ainsi, PROMPT_COMMAND re�oit bien le nom des variables,
 ces derni�res �tant �valu�es lorsque PROMPT_COMMAND est invoqu�e.


 Cependant, $PWD donne le r�pertoire complet. Si l'on veut utiliser le
 raccourci ~, il faut placer toute la s�quence d'�chappement dans
 l'invite pour avoir acc�s aux codes suivants :


      \u          est remplac� par $USERNAME
      \h          est remplac� par le hostname jusqu'au premier '.'
      \w          est remplac� par le repertoire, avec '~' � la place de $HOME
      \[...\]     signale une suite de caract�re non-imprimables





 Ainsi le code suivant produit l'invite bash$ , et place nom@serveur:
 r�pertoire dans le titre (et l'ic�ne) de xterm.





 case $TERM in
    xterm*)
        PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
        ;;
    *)
        PS1="bash\$ "
        ;;
 esac




 L'utilisation de \[...\] signale � bash la pr�sence de caract�res non-
 imprimables, information dont il a besoin lorsqu'il calcule la
 longueur de l'invite. Sans cette pr�caution, les commandes d'�dition
 de ligne ne savent plus tr�s bien o� placer le curseur.



 44..44..  kksshh

 ksh n'offre pas grand chose en terme de fonctions et codes, il faut
 donc mettre notre cha�ne dans l'invite pour qu'elle soit mise � jour
 dynamiquement. L'exemple suivant produit l'invite ksh$ , et place
 nom@serveur: r�pertoire dans le titre (et l'ic�ne) de xterm.


      case $TERM in
         xterm*)
             HOST=`hostname`
             PS1='^[]0;${USER}@${HOST}: ${PWD}^Gksh$ '
             ;;
         *)
             PS1='ksh$ '
             ;;
      esac




 Cependant, $PWD donne le r�pertoire complet. On peut �ter le pr�fixe
 $HOME/ en utilisant la construction ${...##...}. De m�me, on peut
 tronquer le nom du serveur � l'aide de ${...%%...}.


      HOST=`hostname`
      HOST=${HOST%%.*}
      PS1='^[]0;${USER}@${HOST}: ${PWD##${HOME}/}^Gksh$ '




 Les caract�res ^[ et ^G d�signent ESC et BEL (ils peuvent �tre saisis
 dans emacs � l'aide de C-q ESC et C-q C-g).



 44..55..  ccsshh

 C'est assez difficile � r�aliser avec csh. On finit par mettre ce qui
 suit dans le ~/.cshrc :





 switch ($TERM)
    case "xterm*":
        set host=`hostname`
        alias cd 'cd \!*; echo -n "^[]0;${user}@${host}: ${cwd}^Gcsh% "'
        breaksw
    default:
        set prompt='csh% '
        breaksw
 endsw




 Il a fallu faire un alias de la commande cd pour mettre � jour
 l'invite. Les caract�res ^[ et ^G d�signent ESC et BEL (ils peuvent
 �tre saisis dans emacs � l'aide de C-q ESC et C-q C-g).


 Notes : sur certains syst�mes hostname -s peut �tre utilis� pour
 obtenir le nom de la machine au lieu du nom qualifi�. Les utilisateurs
 ayant des liens symboliques sur des r�pertoires trouveront `pwd` plus
 pr�cis que $cwd.



 55..  AAffffiicchheerr llee nnoomm ddee llaa ccoommmmaannddee eenn ccoouurrss dd''eexx��ccuuttiioonn

 Souvent un utilisateur lance une longue commande en avant plan telle
 que top, un �diteur, un lecteur de courrier �lectronique, etc, et
 voudrait que le nom de cette commande figure dans le titre de la
 fen�tre.  C'est un probl�me d�licat qui n'est facile � r�soudre
 qu'avec zsh.


 55..11..  zzsshh

 zsh offre une fonction id�ale pour cet objectif :


      preexec()   fonction ex�cut�e juste avant qu'une commande soit ex�cut�e
      $*,$1,...   arguments pass�s � preexec()




 On peut donc ins�rer le nom de la commande de la mani�re suivante :


      case $TERM in
          xterm*)
            preexec () {
              print -Pn "\e]0;$*\a"
            }
          ;;
      esac




 Note: la fonction preexec() est apparue vers la version 3.1.2 de zsh,
 vous devrez peut-�tre mettre � jour votre ancienne version.





 55..22..  AAuuttrreess sshheellllss

 Ce n'est pas facile avec les autres shells qui n'ont pas l'�quivalent
 de la fonction preexec(). Si quelqu'un a des exemples, merci de les
 communiquer par email � l'auteur.



 66..  tteerrmmiinnaauuxx AAnnnneexxee :: ss��qquueenncceess dd''��cchhaappppeemmeenntt ppoouurr dd''aauuttrreess ��mmuullaa��
 tteeuurrss ddee

 De nombreux �mulateurs de terminaux modernes sont des d�riv�s de xterm
 ou rxvt et acceptent les s�quences d'�chappement que nous avons
 utilis�es jusqu'ici. Certains terminaux propri�taires fournis avec les
 diverses variantes d'unix utilisent leur propres s�quences.



 66..11..  aaiixxtteerrmm  dd''IIBBMM

 aixterm reconna�t les s�quences d'�chappement de xterm.



 66..22..  wwsshh ,, xxwwsshh  eett wwiinntteerrmm  ddee SSGGII

 Ces terminaux d�finissent $TERM=iris-ansi et utilisent :

 �  ESCP1.y_t_e_x_t_eESC\    Pour le titre de la fen�tre

 �  ESCP3.y_t_e_x_t_eESC\    Pour le titre de l'ic�ne

    La liste compl�te des s�quences est donn�e dans la page man
    xwsh(1G).


 Les terminaux d'Irix supportent �galement les s�quences de xterm pour
 d�finir individuellement le titre de la fen�tre et de l'ic�ne, mais
 pas celle pour d�finir les deux en m�me temps.



 66..33..  ccmmddttooooll  eett sshheellllttooooll  ddee SSuunn

 cmdtool et shelltool d�finissent $TERM=sun-cmd et utilisent :

 �  ESC]l_t_e_x_t_eESC\    Pour le titre de la fen�tre

 �  ESC]L_t_e_x_t_eESC\    Pour le titre de l'ic�ne

    Ce sont des programmes vraiment horribles, il vaut mieux utiliser
    autre chose.


 66..44..  CCDDEE ddtttteerrmm

 dtterm d�finit $TERM=dtterm. Il semble qu'il reconnaisse � la fois les
 s�quences xterm standard ainsi que celles du cmdtool de Sun (test� sur
 Solaris 2.5.1, Digital Unix 4.0, HP-UX 10.20).



 66..55..  HHPPtteerrmm

 hpterm d�finit $TERM=hpterm et utilise les s�quences suivantes :

 �  ESC&f0k_l_o_n_g_u_e_u_rD_t_e_x_t_e  Donne le texte _t_e_x_t_e de longueur _l_o_n_g_u_e_u_r
    comme titre de fen�tre

 �  ESC&f-1k_l_o_n_g_u_e_u_rD_t_e_x_t_e  Donne le texte _t_e_x_t_e de longueur _l_o_n_g_u_e_u_r
    comme nom de l'ic�ne


 Un programme C simple pour calculer la longueur et afficher la bonne
 s�quence ressemble � :


      #include <string.h>
      int main(int argc, char *argv[])
      {
          printf("\033&f0k%dD%s", strlen(argv[1]), argv[1]);
          printf("\033&f-1k%dD%s", strlen(argv[1]), argv[1]);
          return(0);
      }





 On peut �galement �crire un shell-script �quivalent, utilisant
 ${#string} (zsh, bash, ksh) ou ${%string} (tcsh) pour obtenir la
 longueur d'une cha�ne. L'exemple suivant est pour zsh :


      case $TERM in
          hpterm)
              str="\e]0;%n@%m: %~\a"
              precmd () {print -Pn "\e&f0k${#str}D${str}"}
              precmd () {print -Pn "\e&f-1k${#str}D${str}"}
              ;;
      esac






 77..  AAnnnneexxee :: eexxeemmpplleess ddaannss dd''aauuttrreess llaannggaaggeess

 Il peut �tre utile d'�crire des bouts de codes pour changer le titre
 de la fen�tre � l'aide des s�quences xterm. Voici quelques exemples :



 77..11..  CC



      #include <stdio.h>

      int main (int argc, char *argv[]) {
        printf("%c]0;%s%c", '\033', argv[1], '\007');
        return(0);
      }








 77..22..  PPeerrll



      #!/usr/bin/perl
      print "\033]0;@ARGV\007";






 88..  CCrr��ddiittss

 Merci aux personnes suivantes pour leur contribution � ce document.


 Paul D. Smith <[email protected]> et Christophe Martin
 <[email protected]> ont tous les deux remarqu� que j'avais
 interverti les guillemets dans le PROMPT_COMMAND pour bash. Les avoir
 dans le bon ordre garantit que les variables sont �valu�es
 dynamiquement.


 Paul D. Smith <[email protected]> a propos� de prot�ger les
 caract�res non-imprimables dans l'invite de bash.


 Christophe Martin <[email protected]> a donn� la solution pour
 ksh.


 Keith Turner <[email protected]> a donn� les s�quences d'�chappement
 pour les cmdtool et shelltool de Sun.


 Jean-Albert Ferrez <[email protected]> a signal� un manque de
 coh�rence dans l'utilisation de "PWD" et "$PWD", ainsi que de "\" et
 "\\".


 Bob Ellison <[email protected]> et Jim Searle
 <[email protected]> ont test� dtterm sur HP-UX.


 Teng-Fong Seak <[email protected]> a sugg�r� l'option -s de
 hostname, l'utilisation de `pwd`, et de echo sous csh.


 Trilia <[email protected]> a sugg�r� les exemples dans d'autres
 langages.


 Brian Miller <[email protected]> a fourni les s�quences
 d'�chappement et les exemples pour hpterm.


 Lenny Mastrototaro <[email protected]> a expliqu� l'utilisation des
 s�quences xterm dans les �mulateurs de terminaux Irix.


 Paolo Supino <[email protected]> a sugg�r� l'utilisation de \\$ dans le
 prompt de bash.