Comment puis-je faire en sorte que Terminal.app sous OS X affiche le répertoire en cours dans le titre de sa fenêtre ou de son onglet ?
J'utilise le bash Shell.
Comment puis-je faire en sorte que Terminal.app sous OS X affiche le répertoire en cours dans le titre de sa fenêtre ou de son onglet ?
J'utilise le bash Shell.
Dépend de votre Shell.
Ce site article affiche plusieurs méthodes.
Personnellement, j'utilise zsh qui possède une fonction precmd() très pratique qui est exécutée avant chaque invite.
precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar prompt
Bien que les autres questions énumèrent des méthodes bash, elles aliènent cd. Bash fournit une méthode inhérente qui enchaîne juste l'invite.
bash
bash fournit une variable PROMPT_COMMAND qui contient une commande à exécuter avant l'invite. Cet exemple (inséré dans ~/.bashrc) fixe le titre à "nom d'utilisateur@hostname : répertoire" :
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
où \033 est le code de caractère pour ESC, et \007 pour BEL. Notez que les guillemets sont importants ici : les variables sont développées dans "...", et non dans "...". Ainsi, PROMPT_COMMAND est défini comme une valeur non développée, mais les variables contenues dans "..." sont développées lorsque PROMPT_COMMAND est utilisé.
Cependant, PWD produit le chemin complet du répertoire. Si nous voulons utiliser le raccourci '~', nous devons intégrer la chaîne d'échappement dans l'invite, ce qui nous permet de profiter des expansions d'invite suivantes fournies par le Shell :
\u expands to $USERNAME
\h expands to hostname up to first '.'
\w expands to directory, replacing $HOME with '~'
\[...\] embeds a sequence of non-printing characters
Ainsi, ce qui suit produit un prompt de "bash$ ", et un titre xterm de "nom d'utilisateur@hostname : répertoire" ...
case $TERM in
xterm*)
PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
;;
*)
PS1="bash\$ "
;;
esac
Notez l'utilisation de [...], qui indique à bash d'ignorer les caractères de contrôle non imprimables lors du calcul de la largeur de l'invite. Sinon, les commandes d'édition de ligne sont confondues lors du placement du curseur.
Copiez et collez dans le fichier ~/.profile :PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"
Le titre de l'onglet actuel du terminal sera remplacé par le nom du dossier dans lequel vous vous trouvez (PAS le chemin d'accès complet).
Alors...Developer/Applications/Utilities/Bluetooth/
devient => Bluetooth
À partir de Mac OS X Lion 10.7, Terminal dispose d'une séquence d'échappement explicite pour définir le répertoire de travail, que Terminal affiche à l'aide de l'icône " proxy " de la fenêtre standard. Cela vous permet d'effectuer un Command-Click pour afficher le chemin d'accès, de le révéler dans le Finder ou de le faire glisser comme n'importe quel autre dossier. En outre, Terminal peut l'utiliser pour créer un autre terminal dans le même répertoire, et pour restaurer le répertoire de travail lorsque vous quittez/redémarrez Terminal (lorsque la fonction Reprise est activée). Il permet également de restaurer les répertoires pour les groupes de fenêtres.
Il s'agit de la même séquence d'échappement de la commande du système d'exploitation (OSC) que pour les titres des fenêtres et des onglets, mais avec le premier paramètre défini sur 7. La valeur doit être une URL "file :". qui permet de coder les caractères spéciaux en pourcentage afin de pouvoir traiter tous les noms de chemin valides. Vous devez également inclure le nom d'hôte afin que Terminal puisse déterminer s'il s'agit d'un répertoire local ; Terminal évitera de l'utiliser comme répertoire de travail actuel s'il provient d'un hôte différent.
Dans le même ordre d'idées, Terminal prend également en charge la définition du "fichier représenté" à l'aide de la séquence d'échappement OSC avec un paramètre de 6. S'il est défini, l'icône du proxy l'affichera à la place du répertoire de travail. Par exemple, j'ai configuré emacs et less pour qu'ils reflètent le fichier/buffer actuellement affiché dans l'icône du proxy. Cela permet à ces programmes basés sur le tty d'être plus intégrés avec le système d'exploitation environnant.
Les comportements de répertoire de travail sont activés par défaut pour bash (par défaut Shell sur Mac OS X). Voir /etc/bashrc pour le code correspondant.
Il convient également de mentionner que le terminal Lion permet désormais de définir le titre de l'onglet indépendamment du titre de la fenêtre à l'aide de la séquence d'échappement OSC.
En plus de vous recommander d'utiliser la séquence d'échappement des commandes du système d'exploitation spécifique au terminal Apple : ESC ] Ps ; Pt BEL
où Ps
es 7
y Pt
est un file:
URL ; il est utile d'ajouter que dans Mac OS X 10.11 (et probablement depuis 10.7), il y a un fichier /etc/bashrc_Apple_Terminal
(non modifiable sous 10.11) qui définit la pratique update_terminal_cwd()
comme (sans les commentaires) :
update_terminal_cwd ()
{
local url_path='';
{
local i ch hexch LC_CTYPE=C LC_ALL=;
for ((i = 0; i < ${#PWD}; ++i))
do
ch="${PWD:i:1}";
if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
url_path+="$ch";
else
printf -v hexch "%02X" "'$ch";
url_path+="%${hexch: -2:2}";
fi;
done
};
printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
}
Vous pouvez également l'utiliser sur vos boîtiers distants, au cas où vous auriez envisagé de le faire et que vous vous seriez demandé comment encoder correctement l'URL du fichier dans bash.
Et si vous changez PROMPT_COMMAND
dans votre propre .bash_profile
o .bashrc
vous pourriez oublier de l'appeler. Dans le même fichier, ils montrent un exemple de chaînage un peu mieux avec :
PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"
Personnellement, dans mon .bash_profile
Je voulais ajouter l'invite git donc j'ai fait ça :
local git_path=/Applications/Xcode.app/Contents/Developer/usr/share/git-core
for f in $git_path/git-completion.bash $git_path/git-prompt.sh
do
if [[ -f "$f" ]]; then
. "$f"
fi
done
get_sha() {
git rev-parse --short HEAD 2>/dev/null
}
if [ "function" = $(type -t __git_ps1) ]; then
export GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWSTASHSTATE=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWCOLORHINTS=1
GIT_PS1_DESCRIBE_STYLE="branch"
GIT_PS1_SHOWUPSTREAM="auto git"
export PROMPT_COMMAND="$PROMPT_COMMAND${PROMPT_COMMAND:+; }"'__git_ps1 "\[\e[0;32m\]\u\[\e[1;32m\]@\h\[\e[0m\]:\[\e[0;34m\]\w\[\e[0m\]" "\$ " "\n{%s $(get_sha)}"'
fi
Les solutions Bash impliquant PS1 et PROMPT_COMMAND échouent toutes deux si le répertoire contient des caractères Unicode (du moins sur Snow Leopard). La meilleure solution que j'ai trouvée est de faire l'équivalent de
PS1="\[\033]0;\`pwd | tr -dC '[\000-\177]'\`\007\]\$ "
Malheureusement, cela ne fonctionne pas directement, donc à la place j'ai défini une fonction Shell pour faire le tr
appeler :
termtitlefilter () { tr -dC '[\000-\177]'; }
PS1="\[\033]0;\`pwd | termtitlefilter\`\007\]\$ "
Cela fonctionne bien pour les accents latins, qui seront en Unicode NFD (les accents disparaîtront mais le caractère latin sous-jacent restera).
Malheureusement, il échouera complètement pour des choses comme le chinois.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.