web-dev-qa-db-fra.com

Définit le titre de la fenêtre du terminal dans le répertoire actuel

Comment faire en sorte que Terminal.app sous OS X affiche le répertoire actuel dans le titre de sa fenêtre ou de son onglet?

J'utilise le bash Shell.

71
kareman

Cela dépend de votre shell.

Cet article affiche plusieurs méthodes.

Personnellement, j’utilise zsh avec une fonction pratique precmd () exécutée avant chaque invite.

    precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar Prompt

Bien que les autres questions énumèrent les méthodes bash, elles ont pour alias cd. Bash fournit une méthode inhérente qui enchaîne uniquement l'invite.

bash

bash fournit une variable Prompt_COMMAND qui contient une commande à exécuter avant l'invite. Cet exemple (inséré dans ~/.bashrc) définit le titre sur "username @ hostname: directory":

 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 la citation est importante ici: les variables sont développées dans "...", et non développées dans '...'. Donc, Prompt_COMMAND est défini sur une valeur non développée, mais les variables à l'intérieur de "..." sont développées lorsque Prompt_COMMAND est utilisé.

Cependant, PWD génère le chemin de répertoire complet. Si nous voulons utiliser le raccourci '~', nous devons incorporer la chaîne d'échappement dans l'invite, ce qui nous permet de tirer parti des extensions 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 une invite de "bash $" et un titre xterm de "nomutilisateur @ nomhôte: 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 confuses lors du placement du curseur.

59
Darren Hall

Copier/coller dans le fichier ~/.profile:
Prompt_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $Prompt_COMMAND"

Cela définira le titre de l'onglet du terminal actuel sur le nom du dossier dans lequel vous vous trouvez (PAS le chemin d'accès complet).
Alors...
Developer/Applications/Utilities/Bluetooth/ devient => Bluetooth

31
Allisone

A partir de Mac OS X Lion 10.7, Terminal dispose d'une séquence d'échappement explicite pour la définition du répertoire de travail, que Terminal affiche à l'aide de l'icône "proxy" de la fenêtre standard. Cela vous permet de cliquer dessus avec la touche Commande pour voir le chemin, de le révéler dans le Finder ou de le faire glisser comme n'importe quel autre dossier. De plus, Terminal peut l'utiliser pour créer un autre terminal dans le même répertoire et pour restaurer le répertoire de travail lors de la fermeture/du redémarrage du terminal (lorsque la reprise est activée). Il permet également la restauration de répertoires pour les groupes de fenêtres.

Il s'agit de la même séquence d'échappement de commande du système d'exploitation (OSC) que pour les titres de fenêtre et d'onglet, mais avec le premier paramètre défini sur 7. La valeur doit être une URL "fichier:", qui active les caractères spéciaux codés en pourcentage afin de pouvoir la gérer. tous les chemins 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.

Sur une note connexe, 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. Si cette option est définie, l'icône du proxy affichera celui-ci à la place du répertoire de travail. Par exemple, j'ai emacs and less configuré pour refléter le fichier/tampon actuellement affiché dans l'icône du proxy. Cela permet à ces programmes basés sur des terminaux d'être mieux intégrés au système d'exploitation environnant.

Les comportements de répertoire de travail sont activés par défaut pour bash (le shell par défaut sous Mac OS X). Voir/etc/bashrc pour le code correspondant.

Il convient également de mentionner que Lion Terminal prend désormais en charge la définition du titre de l'onglet, indépendamment du titre de la fenêtre, à l'aide de la séquence d'échappement OSC.

11
Chris Page

Outre la recommandation d'utiliser la séquence d'échappement de la commande de système d'exploitation spécifique au terminal Apple: ESC ] Ps ; Pt BELPs est 7 et Pt est une URL file:; Cela vaut la peine d'ajouter que dans Mac OS X 10.11 (et probablement depuis 10.7), il existe 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îtes distantes, au cas où vous envisagiez de le faire, puis vous effleurer l'encodage correct de l'URL du fichier dans bash.

Et si vous changez Prompt_COMMAND dans votre propre .bash_profile ou .bashrc, vous pourriez oublier d'appeler ceci. Dans le même fichier, ils montrent un exemple de chaînage un peu meilleur avec:

Prompt_COMMAND="update_terminal_cwd${Prompt_COMMAND:+; $Prompt_COMMAND}"

Personnellement, dans mon .bash_profile, je voulais ajouter l'invite git et j'ai donc fait ceci:

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
3
dlamblin

En supposant que vous utilisiez le terminal MAC par défaut, vous pouvez utiliser le suivant dans le fichier .profile, car "set_Prompt" peut à lui seul vous envoyer au dossier racine lorsque vous ouvrez un nouvel onglet:

set_Prompt () {
    BASE_PATH="${PWD##*/}"
    echo -ne "\033]0;$BASE_PATH\007"
}
set_my_tab () {
   update_terminal_cwd
   set_Prompt
}

Prompt_COMMAND=set_my_tab
1
Kopz Kyoto

Les solutions Bash impliquant PS1 et Prompt_COMMAND échouent si le répertoire contient des caractères Unicode (du moins sur Snow Leopard). La meilleure solution que je pouvais trouver était de faire l'équivalent de

PS1="\[\033]0;\`pwd | tr -dC '[\000-\177]'\`\007\]\$ "

Malheureusement, cela ne fonctionne pas directement. J'ai donc défini une fonction Shell pour effectuer l'appel tr:

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, cela échouera complètement pour des choses comme le chinois.

1
Michael Norrish

Entrez ceci dans votre fichier ~/.profile ou équivalent:

function settitle() { echo -n "]0;$@"; }
function cd() { command cd "$@"; settitle `pwd -P`; }

export PS1='\W \$ '

settitle `pwd`

La première ligne contient deux caractères spéciaux qui ne peuvent pas être copiés/collés, mais vous pouvez télécharger le texte à partir d’ici: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .

0
kareman