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

71

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 shell bash.

kareman
la source
Je me demande toujours pourquoi même les personnes qui répondent à la question ne l'oublient pas.
cregox

Réponses:

60

Cela dépend de votre coquille.

Cet article affiche plusieurs méthodes.

Personnellement, j'utilise zsh, qui a une fonction pratique precmd () 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 les méthodes bash, elles ont pour alias cd. Bash fournit une méthode inhérente qui enchaîne simplement l'invite.

frapper

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'invites 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 lignes sont confuses lors du placement du curseur.

Darren Hall
la source
J'aurais dû mentionner que j'utilise bash, j'ai mis à jour la question.
Kareman
Ajout de la méthode bash à partir du lien indiqué.
Darren Hall
1
Très bien. Pour obtenir uniquement le chemin d'accès au répertoire en cours dans le titre et le nom du répertoire en cours dans l'invite, je viens d'utiliser PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $".
Kareman
1
"Si nous voulons utiliser le raccourci '~', nous devons incorporer la chaîne d'échappement dans l'invite" Vous pouvez utiliser ce qui suit pour remplacer le chemin d'accès complet du répertoire personnel par un tilde: $ {PWD / # $ {HOME} / \ ~}
Chris Page
1
@ MattTagg Bien sûr, il vous suffit de le placer dans votre ~/.profilefichier (ou équivalent) sur la machine distante.
coredumperror
32

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

Tout est un
la source
3
Sur mavericks, le fichier à éditer est ~ / .bash_profile
Tom
11

A partir de Mac OS X Lion 10.7, Terminal dispose d'une séquence d'échappement explicite pour la configuration 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 sur cette touche pour voir le chemin, de la révéler dans le Finder ou de la faire glisser comme n'importe quel autre dossier. En outre, Terminal peut utiliser cette option 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 défini, l'icône du proxy affichera ceci au lieu du répertoire de travail. Par exemple, j'ai emacs et moins configuré pour refléter le fichier / tampon actuellement affiché dans l'icône de proxy. Cela permet à ces programmes basés sur les 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.

Chris Page
la source
La update_terminal_cwdfonction définira l'icône du proxy dans le répertoire de travail actuel. Par défaut $PROMPT_COMMANDest update_terminal_cwd.
jtbandes
@jtbandes C'est ce à quoi je faisais référence lorsque j'ai écrit «Les comportements des répertoires de travail sont activés par défaut pour bash…».
Chris Page
Oui. Je viens de découvrir comment cela fonctionne et j'ai pensé que cela pourrait être utile aux futurs googlers!
jtbandes
3

Outre la recommandation d'utiliser la séquence d'échappement Commande du système d'exploitation spécifique au terminal Apple: ESC ] Ps ; Pt BELPsest 7et Ptest une file:URL; 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 ce qui convient 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 modifiez PROMPT_COMMANDvous-même .bash_profileou si .bashrcvous oubliez d’appeler cela. 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_profileje voulais ajouter l'invite git donc j'ai 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
Dlamblin
la source
1

Les solutions Bash impliquant PS1 et PROMPT_COMMAND échouent si le répertoire contient des caractères Unicode (au 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' trappel:

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.

Michael Norrish
la source
A partir de Mac OS X Lion 10.7, Terminal dispose d'une séquence d'échappement explicite pour la configuration du répertoire de travail. Il utilise une URL, vous pouvez donc utiliser le codage en pourcentage pour les caractères spéciaux et prendre en charge tous les noms de chemin valides. Voir ma réponse à cette question pour plus de détails.
Chris Page
1

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
Kopz Kyoto
la source
0

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 .

kareman
la source
1
"La première ligne contient deux caractères spéciaux qui ne peuvent pas être copiés / collés" Au lieu d' echoutiliser printf, ce qui vous permet d'exprimer ces caractères (ESC et BEL / Control-G) avec des séquences d'échappement:printf '\e]0;$@\a"
Chris Page du