winni@xpilot.org
ferrez@dma.epfl.ch
La plupart des gens vous diront que c'est stupide : il suffit de faire un
xterm -T "Emplacement publicitaire a louer" \
-n "Vous pouvez aussi avoir le nom de l'icone" &
pour avoir n'importe quel texte dans la barre de titre de xterm
. Certes,
mais si vous voulez changer ce texte après le démarrage ?
Pour changer le titre de xterm
pendant l'exécution, il suffit de lui
envoyer une séquence spéciale de caractères. Une telle séquence est appelée
"séquence d'échappement" et n'est généralement pas affichée telle quelle à
l'écran, mais provoque au contraire une action particulière.
Par exemple, si vous tapez <ctrl-v>
<Esc>
<c>
<Enter>
, votre xterm
devrait se réinitialiser
(c'est à dire effacer l'écran). Le <ctrl-v>
et le
<Enter>
ne servent en fait qu'à dire au shell (bash) d'afficher
la séquence <Esc>
<c>
elle-même.
Vous aurez compris que je désigne les touches par leur nom entouré de <>.
Maintenant, pour changer la texte de la barre de titre et de l'icône de
xterm
, il suffit d'utilliser les séquences d'échappement :
<esc> <]> <2> <;> pour le titre
<esc> <]> <1> <;> pour le nom de l'icone
Pour envoyer ces séquences à xterm
, au lieu de les taper au clavier, nous
allons utiliser la commande echo
echo -e "\033]2; Emplacement publicitaire a louer. \007"
Vous l'aurez certainement deviné : "\\033" est la représentation octale du caractère échappemment (Esc) et l'option -e active cette syntaxe. Il faut terminer le texte qui doit apparaître dans la barre de titre avec un <ctrl-g>, également connu sous le nom de "bip".
Une application intéressante de ces possibilités est de déplacer les informations affichées d'habitude dans l'invite (prompt) vers la barre de titre. Supposons que vous ayez défini votre invite ainsi :
export PS1='\u@\h:\w> '
ce qui donne par exemple :
winni@FeilSurf:~/mail>
Qu'est ce qui arrive si vous allez dans le répertoire
"/afs/rrz.uni-koeln.de/pub/packages/linux/kernel/v2.0"
? L'invite
devient longue et ne laisse pas beaucoup de place pour taper des commandes.
winni@FeilSurf:/afs/rrz.uni-koeln.de/pub/packages/linux/kernel/v2.0>
C'est embêtant. Mais si vous mettez ces informations dans la barre de titre, tout rentre dans l'ordre :
export PS1='\033]2; \u@\h:\w \007bash> '
Cette commande affiche la séquence d'échappement appropriée et ne laisse
que bash> _
dans l'invite.
Malheureusement, la longueur maximale de la valeur de PS1
est
d'environ 60 (?) caractères et donc ce qui précède ne peut pas toujours
être appliqué. Une autre idée est de redéfinir certaines commandes internes
du shell tels que cd
pour afficher ces séquences d'échappement, mais
cela a pour effet secondaire indésirable de modifier sans cesse la barre
de titre lors de l'exécution de scripts de commandes ... (eh oui, chaque
cd
change le titre).
La manière la plus sure me semble être l'utilisation de la variable
d'environnemet "PROMPT_COMMAND
". Le contenu de cette variable est
exécuté à la fin de chaque commande avant que bash ne réimprime
l'invite. L'exemple suivant est très utile dans un environnement réseau
avec beaucoup de xterm
ouverts :
export PROMPT_COMMAND='echo -ne "\033]2;$LOGNAME@$HOST Directory: $PWD\007\033]1;$LOGNAME@$HOST\007"'
... notamment lorsque vous regardez la liste des fenêtres affichée par
votre window-manager. Et pour être parfait, on ne définit cette
variable que lorsque l'on est dans un xterm
:
if [ "$TERM" = "xterm" -o "$TERM" = "xterm-color" -o \
"$TERM" = "rxvt" -o "$TERM" = "vs100" ]
then
PS1='bash> '
PS2='bash>> '
PS3='bash>>> '
export PROMPT_COMMAND='echo -ne "\033]2;$LOGNAME@$HOST:$PWD\007\033]1;$LOGNAME@$HOST\007"'
fi
Notez que l'invite "bash> "
rend la ligne de commande plus
consistente puisque plusieurs programmes mettent leur nom ainsi (gnuplot,
ncftp, gap, kash, ...). Mais même cette manière de faire pose problème avec
certains programmes qui comme "ytalk"
lancent des sous-shells. Si cela
vous arrive, faites simplement :
unset PROMPT_COMMAND
Joyeux Linuxage (Happy Linuxing) -Winfried Trümper <winni@xpilot.org>
CREDITS:
Ville Voutilainen <vvoutila@raita.oulu.fi> qui a remarqué que les ;s manquaient dans la première moité du document.
PS:
N'utilisez jamais de séquences d'échappement brutes dans vos programmes !
Utilisez le programme tput
pour déterminer les séquences adéquates en
fonction de la variable d'environnement $TERM
et de la description
symbolique de l'action désirée. Voyez tput(1) pour plus de détails
(tapez man 1 tput
sur la ligne de commande).
Les séquences d'échappement pour la barre de titre de xterm
sont la seule
exception à cette règle.
PS2:
Si vous voulez connaître la liste des séquences d'échappement que xterm
comprend, jetez un oeil dans les sources de rxvt
au fichier
doc/xterm.seq
.