Question Définir le titre de la fenêtre du terminal dans le répertoire en cours


Comment puis-je obtenir le Terminal.app sous OS X pour afficher le répertoire actuel dans son titre de fenêtre ou d’onglet?

J'utilise le shell bash.


67
2017-12-07 18:27


origine


Je me demande toujours pourquoi même les personnes qui répondent à la question ne se souviennent pas de voter. - cregox


Réponses:


Dépend de votre coquille.

Ce article affiche plusieurs méthodes.

J'utilise personnellement zsh qui dispose d'une fonction precmd () 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 listent les méthodes bash, elles s'appellent cd. Bash fournit une méthode inhérente qui ne chaine que 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 "...". Ainsi, 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 produit 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 expansions 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, les éléments suivants génèrent une invite "bash $" et un titre xterm de "username @ hostname: directory" ...

 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 de modification de ligne deviennent confuses lors du placement du curseur.


59
2017-12-07 19:01



J'aurais dû mentionner que j'utilise bash, j'ai mis à jour la question. - kareman
Ajout de la méthode bash à partir du lien répertorié. - Darren Hall
Très bien. Pour obtenir uniquement le chemin d'accès au répertoire actuel dans le titre et le nom du répertoire actuel dans l'invite, je viens d'utiliser PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $". - kareman
"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 home par tilde: $ {PWD / # $ {HOME} / \ ~} - Chris Page
@MattTagg Bien sûr, il vous suffit de le mettre dans votre ~/.profile (ou équivalent) fichier sur la machine distante. - CoreDumpError


Copiez et collez dans le fichier ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

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


30
2018-03-12 08:22



Sur les non-conformistes, le fichier à éditer est ~ / .bash_profile - Tom


A 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 le terminal affiche à l'aide de l'icône "proxy" de la fenêtre standard. Cela vous permet de cliquer-Commande pour voir le chemin, révéler dans le Finder ou 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 sortie / redémarrage du terminal (lorsque la fonction de 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 OSC (Operating System Command) 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 "file:" qui active les caractères spéciaux codés en pourcentage. tous les chemins d'accès 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 évite de l'utiliser comme répertoire de travail en cours 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. S'il est défini, l'icône proxy affichera ce paramètre 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 du proxy. Cela permet à ces programmes basés sur tty d'être plus intégrés avec le système d'exploitation environnant.

Les comportements du 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 approprié.

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 en utilisant la séquence d'échappement OSC.


11
2017-08-11 06:50



le update_terminal_cwd fonction définira l'icône proxy dans le répertoire de travail en cours. Par défaut $PROMPT_COMMAND est update_terminal_cwd. - jtbandes
@jtbandes C'est ce à quoi je faisais allusion lorsque j'ai écrit "Les comportements du répertoire 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 pour les futurs googleurs! - jtbandes


Outre la recommandation d'utiliser la séquence d'échappement spécifique à la commande du système d'exploitation Apple Terminal: ESC ] Ps ; Pt BEL où Ps est 7 et Pt est un file: URL; cela vaut la peine 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 le commode 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 penseriez le faire, puis vous gratter la tête en encodant correctement l'URL du fichier dans bash.

Et si vous changez PROMPT_COMMAND dans votre propre .bash_profile ou .bashrc vous pourriez oublier d'appeler cela. Dans le même fichier, ils montrent un exemple de l’enchaînement avec:

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

Personnellement dans mon .bash_profile Je voulais ajouter l'invite git alors 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

2
2018-05-05 17:13





Les solutions Bash impliquant PS1 et PROMPT_COMMAND échouent toutes les deux 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, donc au lieu de cela j'ai défini une fonction de shell pour faire le tr appel:

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
2017-07-30 02:07



A 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. Il utilise une URL, vous pouvez donc utiliser le codage en pourcentage pour les caractères spéciaux et prendre en charge tous les chemins d'accès valides. Voir ma réponse à cette question pour plus de détails. - Chris Page


En supposant que vous utilisez le terminal MAC par défaut, vous pouvez utiliser le suivant dans .profile puisque "set_prompt" peut à lui seul vous envoyer dans le 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
2018-03-27 19:20





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 ici: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh.


0
2017-12-07 19:01



"La première ligne contient deux caractères spéciaux qui ne peuvent pas être copiés / collés" au lieu d'utiliser echo utilisation printf, 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