78 votes

Définir le titre de la fenêtre du terminal au répertoire actuel

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.

67voto

vaske Points 2468

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.

34voto

binarysmacker Points 233

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

12voto

Chris Page Points 3113

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

3voto

JoelB Points 84

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 BELPs 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

1voto

Michael Norrish Points 163

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.

SistemesEz.com

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.

Powered by:

X