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.