  Xterm-Title mini-HOWTO
  Ric Lister, ric@giccs.georgetown.edu
  traduction Jean-Albert Ferrez, Jean-Albert.Ferrez@epfl.ch
  Derniere modification : 30.12.1997

  Ce document explique comment utiliser des sequences d'echappement pour
  modifier dynamiquement le titre de  la  fenetre  et  de  l'icone  d'un
  xterm.  Des  exemples  sont  donnes pour plusieurs shells, et l'annexe
  donne les sequences pour d'autres types de terminaux.

  11..  OOuu ttrroouuvveerr ccee ddooccuummeenntt

  Ce document fait desormais partie des HOWTOs Linux et peut etre trouve
  a :  <http://sunsite.unc.edu/LDP/HOWTO/mini/Xterm-Title.html>.

  La     derniere     version     en     date     se    trouve    a    :
  <http://www.giccs.georgetown.edu/~ric/howto/Xterm-Title.html>.

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

  22..  TTiittrreess ssttaattiiqquueess

  Les  titres  des  emulateurs  de  terminaux xterm, color-xterm ou rxvt
  peuvent etre donnes sur la ligne de commande avec les  options  -T  et
  -n :

       xterm -T "Le titre de mon XTerm" -n "Le titre de son icone"

  33..  TTiittrreess ddyynnaammiiqquueess

  Bon  nombre  de  personnes  trouvent utile de faire apparaitre dans le
  titre de leur terminal une information qui change dynamiquement, telle
  que  le  nom  du  serveur  sur  lequel  on est connecte, le repertoire
  courant, etc.

  On peut le faire a  l'aide  des  sequences  d'echappement  XTerm.  Les
  sequences suivantes sont utiles dans ce but :

       ESC]0;texteBEL    Change le titre de la fenetre et de l'icone
       ESC]1;texteBEL    Change le titre de l'icone
       ESC]2;texteBEL    Change le titre de la fenetre

  ou  ESC  est  le  caractere  escape (echappement, \033), et BEL est le
  caractere bell (bip, \007).

  Note: Ces sequences fonctionnent egalement avec la plupart des derives
  de  xterm, tels que nxterm, color-xterm et rxvt. D'autre emulateurs de
  terminaux utilisent d'autres sequences, quelques exemples sont  donnes
  en  annexe.  La  liste complete des sequences d'echappement est donnee
  dans le fichier ctlseq2.txt de la distribution de xterm,  ou  dans  le
  fichier xterm.seq de la distribution de rxvt.

  Ces  sequences doivent vraiment etre donnees lors de chaque changement
  de l'invite. De cette facon, le titre est mis a jour  lors  de  chaque
  commande  et  peut  ainsi  refleter  des  informations  telles  que le
  repertoire en cours, le nom d'utilisateur, le  nom  du  serveur,  etc.
  Certains  interpreteurs  de  commandes  (shells) offrent des fonctions
  speciales pour y parvenir, d'autres pas : il faut dans ce cas  inserer
  la chaine directement dans le texte de l'invite.

  44..  EExxeemmpplleess ppoouurr qquueellqquueess sshheellllss

  Dans   tous   les   exemples   ci-dessous,   on   teste   la  variable
  d'environnement TERM pour etre certain de  n'appliquer  ces  sequences
  que  si  l'on  est  dans  un  xterm  (ou derive). Le test est fait sur
  TERM=xterm*, de maniere a inclure au passage les variantes telles  que
  TERM=xterm-color (defini par rxvt).

  44..11..  zzsshh

  On utilise quelques fonctions et codes offerts par zsh :

       precmd ()   fonction executee juste avant chaque invite
       chpwd ()    fonction executee lors de chaque changement de repertoire
       \e          code du caractere escape (ESC)
       \a          code du caractere bip (BEL)
       %n          code remplace par $USERNAME
       %m          code remplace par le hostname jusqu'au premier '.'
       %~          code remplace par le repertoire, avec '~' a la place de $HOME

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

  Ainsi,    le    code    suivant,    mis    dans    ~/.zshrc,   affiche
  "nom@serveur:repertoire" dans le titre de la fenetre (et de  l'icone).

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

  On arrive au meme resultat en utilisant chpwd() au lieu de precmd().

  44..22..  bbaasshh

  bash  offre  la  variable  PROMPT_COMMAND  qui contient une commande a
  executer avant d'afficher l'invite. Ce code  (insere  dans  ~/.bashrc)
  affiche  "nom@serveur:repertoire"  dans  le titre de la fenetre (et de
  l'icone).

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

  ou \033 est le caractere ESC et \007 BEL. Il convient de noter que les
  guillemets  jouent  un role important : les variables entre "..." sont
  evaluees, alors  que  celles  entre  '...'  ne  le  sont  pas.  Ainsi,
  PROMPT_COMMAND  recoit  bien le nom des variables, ces dernieres etant
  evaluees lorsque PROMPT_COMMAND est invoquee.

  Cependant, $PWD donne le repertoire complet. Si l'on veut utiliser  le
  raccourci  '~',  il  faut  placer toute la sequence d'echappement dans
  l'invite pour avoir acces aux codes suivants :

       \u          code remplace par $USERNAME
       \h          code remplace par le hostname jusqu'au premier '.'
       \w          code remplace par le repertoire, avec '~' a la place de $HOME
       \[...\]     signale une suite de caractere non-imprimables

  Ainsi  le  code  suivant  produit  l'invite   "bash$   ",   et   place
  "nom@serveur:repertoire" dans le titre (et l'icone) de xterm.

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

  L'utilisation de \[...\] signale a bash la presence de caracteres non-
  imprimables,  information  dont  il  a  besoin  lorsqu'il  calcule  la
  longueur  de  l'invite. Sans cette precaution, les commandes d'edition
  de ligne ne savent plus tres bien ou placer le curseur.

  44..33..  ttccsshh

  tcsh offre des possibilites similaires a celles de zsh :

       precmd ()   fonction executee juste avant chaque invite
       chpwd ()    fonction executee lors de chaque changement de repertoire
       %n          code remplace par $USERNAME
       %m          code remplace par le hostname jusqu'au premier '.'
       %~          code remplace par le repertoire, avec '~' a la place de $HOME

  Malheureusement, il n'y a pas d'equivalent a la fonction print de  zsh
  qui permette d'utiliser les codes de l'invite dans la chaine 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 repertoire, sans '~'. Par
  contre, on peut mettre la chaine 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  "nom@serveur:repertoire"  dans
  le  titre  (et  l'icone)  de  xterm. Les "%{...%}" doivent etre places
  autour des sequences d'echappement (et ne peuvent pas etre le  dernier
  element de l'invite, 'man tcsh' donne plus de details).

  44..44..  ccsshh

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

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

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

  Je suggere de laisser tomber csh au profit d'un shell plus evolue  tel
  que zsh, bash ou tcsh.

  44..55..  kksshh

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

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

  Cependant, $PWD donne le repertoire complet. On peut oter  le  prefixe
  $HOME/  en  utilisant  la  construction  ${...##...}. De meme, on peut
  tronquer le nom du serveur a l'aide de ${...%%...}.

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

  Les caracteres '^[' et '^G' designent ESC et  BEL  (ils  peuvent  etre
  saisis dans emacs a l'aide de C-q ESC et C-q C-g).

  55..  tteerrmmiinnaauuxx AAnnnneexxee :: sseeqquueenncceess dd''eecchhaappppeemmeenntt ppoouurr dd''aauuttrree eemmuullaatteeuurrss
  ddee

  55..11..  wwsshh,, xxwwsshh eett wwiinntteerrmm ddee SSGGII

  Ces terminaux definissent TERM=iris-ansi et utilisent :

       ESC P 1 .y texte ESC \\    Pour le titre de la fenetre
       ESC P 3 .y texte ESC \\    Pour le titre de l'icone

  La liste complete des sequences est donnee dans xwsh(1G).

  55..22..  ccmmddttooooll eett sshheellllttooooll ddee SSuunn

  cmdtool and shelltool definissent TERM=sun-cmd et utilisent :

       ESC ] l texte ESC \        Pour le titre de la fenetre
       ESC ] L texte ESC \        Pour le titre de l'icone

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

  55..33..  CCDDEE ddtttteerrmm

  dtterm definit TERM=dtterm. Il semble qu'il reconnaisse a la fois  les
  sequences  xterm  standard ainsi que celles du cmdtool de Sun (je n'ai
  teste ceci que sur une Sun ... est-ce que quelqu'un en a les  versions
  HP et DEC et peut tester ceci pour moi ?).

  55..44..  EExxeemmppllee

  Voici  ce  que  j'ai  avec  zsh  pour tenir compte des divers types de
  terminaux :

       case $TERM in

        xterm*|dtterm)
          precmd () {print -Pn "\e]0;%n@%m: %~\a"}  ## fenetre et icone
          ;;

        iris-ansi)
          precmd () {
            print -Pn "\eP1.y%n@%m: %~\e\\"         ## fenetre
            print -Pn "\eP3.y%n@%m: %~\e\\"         ## icone
          }
          ;;

        sun-cmd)
          precmd () {
            print -Pn "\e]l%n@%m: %~\e\\"           ## fenetre
            print -Pn "\e]L%n@%m: %~\e\\"           ## icone
          }
          ;;

       esac

  66..  CCrreeddiittss

  Merci aux personne suivantes

  +o  Paul  D.  Smith   psmith@BayNetworks.COM   et   Christophe   Martin
     cmartin@ipnl.in2p3.fr  ont  tous  les  deux  remarque  que  j'avais
     interverti les guillemets dans le  PROMPT_COMMAND  pour  bash.  Les
     avoir  dans  le  bon ordre garantit que les variables sont evaluees
     dynamiquement.

  +o  Paul D. Smith psmith@BayNetworks.COM  a  propose  de  proteger  les
     caracteres non-imprimables dans l'invite de bash.

  +o  Christophe  Martin  cmartin@ipnl.in2p3.fr  a donne la solution pour
     ksh.

  +o  Keith Turner keith@silvaco.com a donne les sequences  d'echappement
     pour les cmdtool et shelltool de Sun.

