ric@giccs.georgetown.edu
Jean-Albert.Ferrez@epfl.ch
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
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"
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.
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;nomBEL
-- Change le titre de la fen�tre et
de l'ic�neESC]1;nomBEL
-- Change le titre de l'ic�neESC]2;nomBEL
-- Change le titre de la fen�treo� 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.
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.
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.)
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 %
.
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).
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.
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
).
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
.
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
.
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.
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.
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.
aixterm
d'IBM
aixterm
reconna�t les s�quences d'�chappement de xterm
.
wsh
, xwsh
et winterm
de SGI
Ces terminaux d�finissent $TERM=iris-ansi
et utilisent :
ESCP1.ytexteESC\ Pour le titre de la fen�tre
ESCP3.ytexteESC\ Pour le titre de l'ic�ne
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.
cmdtool
et shelltool
de Sun
cmdtool
et shelltool
d�finissent $TERM=sun-cmd
et
utilisent :
ESC]ltexteESC\ Pour le titre de la fen�tre
ESC]LtexteESC\ Pour le titre de l'ic�ne
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).
hpterm
d�finit $TERM=hpterm
et utilise les s�quences
suivantes :
ESC&f0klongueurDtexte Donne le texte
texte de longueur longueur comme titre de fen�tre
ESC&f-1klongueurDtexte Donne le texte
texte de longueur longueur 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
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 :
#include <stdio.h>
int main (int argc, char *argv[]) {
printf("%c]0;%s%c", '\033', argv[1], '\007');
return(0);
}
#!/usr/bin/perl
print "\033]0;@ARGV\007";
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
.