Comment changer le titre d'un xterm

Ric Lister, ric@giccs.georgetown.edu
traduction Jean-Albert Ferrez, Jean-Albert.Ferrez@epfl.ch

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.

1. O� trouver ce document

Ce document fait d�sormais partie des HOWTOs Linux 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

2. Titres statiques

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"

3. Titres dynamiques

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.

3.1 Les s�quences d'�chappement xterm

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 :

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.

Note: 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 de la distribution de xterm, ou dans le fichier xterm.seq de la distribution de rxvt.

3.2 Afficher les s�quences d'�chappement

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.

4. Exemples pour quelques shells

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 Csh Programming Considered Harmful 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 .shellrc (ex : .zshrc, .tcshrc, etc.)

4.1 zsh

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 %.

4.2 tcsh

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 "nom@serveur: r�pertoire" 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).

4.3 bash

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.

4.4 ksh

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).

4.5 csh

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.

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

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.

5.1 zsh

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.

5.2 Autres shells

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.

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

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.

6.1 aixterm d'IBM

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

6.2 wsh, xwsh et winterm de SGI

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

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.

6.3 cmdtool et shelltool de Sun

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

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

6.4 CDE dtterm

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).

6.5 HPterm

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

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

7. Annexe : exemples dans d'autres langages

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 :

7.1 C

#include <stdio.h>

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

7.2 Perl

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

8. Cr�dits

Merci aux personnes suivantes pour leur contribution � ce document.

Paul D. Smith <psmith@BayNetworks.COM> et Christophe Martin <cmartin@ipnl.in2p3.fr> 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 <psmith@BayNetworks.COM> a propos� de prot�ger les caract�res non-imprimables dans l'invite de bash.

Christophe Martin <cmartin@ipnl.in2p3.fr> a donn� la solution pour ksh.

Keith Turner <keith@silvaco.com> a donn� les s�quences d'�chappement pour les cmdtool et shelltool de Sun.

Jean-Albert Ferrez <ferrez@dma.epfl.ch> a signal� un manque de coh�rence dans l'utilisation de "PWD" et "$PWD", ainsi que de "\" et "\\".

Bob Ellison <papillo@hpellis.fc.hp.com> et Jim Searle <jims@broadcom.com> ont test� dtterm sur HP-UX.

Teng-Fong Seak <seak@drfc.cad.cea.fr> a sugg�r� l'option -s de hostname, l'utilisation de `pwd`, et de echo sous csh.

Trilia <trilia@nmia.com> a sugg�r� les exemples dans d'autres langages.

Brian Miller <bmiller@telstra.com.au> a fourni les s�quences d'�chappement et les exemples pour hpterm.

Lenny Mastrototaro <lenny@click3x.com> a expliqu� l'utilisation des s�quences xterm dans les �mulateurs de terminaux Irix.

Paolo Supino <paolo@init.co.il> a sugg�r� l'utilisation de \\$ dans le prompt de bash.