Impostare il titolo della finestra del terminale sulla directory corrente


71

Come posso ottenere Terminal.app in OS X per visualizzare la directory corrente nella sua finestra o nel titolo della scheda?

Sto usando la shell bash.


Mi chiedo sempre perché nemmeno le persone che rispondono alla domanda ricordano di votarla.
cregox,

Risposte:


60

Dipende dalla tua shell.

Questo articolo mostra più metodi.

Personalmente uso zsh che ha una comoda funzione precmd () che viene eseguita prima di ogni prompt.

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

Sebbene le altre domande elencino i metodi bash, alias cd. Bash fornisce un metodo intrinseco che concatena solo il prompt.

bash

bash fornisce una variabile PROMPT_COMMAND che contiene un comando da eseguire prima del prompt. Questo esempio (inserito in ~ / .bashrc) imposta il titolo su "nomeutente @ nome host: directory":

 PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

dove \ 033 è il codice carattere per ESC e \ 007 per BEL. Si noti che la citazione è importante qui: le variabili vengono espanse in "..." e non espanse in "...". Quindi PROMPT_COMMAND è impostato su un valore non espanso, ma le variabili all'interno di "..." vengono espanse quando si utilizza PROMPT_COMMAND.

Tuttavia, PWD produce il percorso completo della directory. Se vogliamo usare la scorciatoia '~', dobbiamo incorporare la stringa di escape nel prompt, che ci consente di sfruttare le seguenti espansioni di prompt fornite dalla 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

Pertanto, quanto segue produce un prompt di "bash $" e un titolo xterm di "nomeutente @ nomehost: directory" ...

 case $TERM in
     xterm*)
        PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
        ;;
     *)
        PS1="bash\$ "
        ;;
 esac

Si noti l'uso di [...], che dice a bash di ignorare i caratteri di controllo non stampabili quando si calcola la larghezza del prompt. Altrimenti i comandi di modifica delle righe vengono confusi durante il posizionamento del cursore.


Avrei dovuto menzionare che sto usando bash, ho aggiornato la domanda.
Kareman,

Aggiunto il metodo bash dal link elencato.
Darren Hall,

1
Molto bene. Per ottenere solo il percorso della directory corrente nel titolo e il nome della directory corrente nel prompt ho appena usato PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $".
Kareman,

1
"Se vogliamo usare la scorciatoia '~' dobbiamo incorporare la stringa di escape nel prompt" Puoi usare quanto segue per sostituire il percorso completo della directory home con tilde: $ {PWD / # $ {HOME} / \ ~}
Chris Page

1
@MattTagg Certo, devi solo inserirlo nel tuo file ~/.profile(o equivalente) sul computer remoto.
coredumperror,

32

Copia e incolla nel file ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

Ciò imposterà il titolo della scheda del terminale corrente sul nome della cartella in cui ci si trova (NON l'intero percorso).
Quindi ...
Developer/Applications/Utilities/Bluetooth/diventa =>Bluetooth


3
Sui maverick il file da modificare è ~ / .bash_profile
Tom

11

A partire da Mac OS X Lion 10.7, Terminal ha una sequenza di escape esplicita per l'impostazione della directory di lavoro, che Terminal visualizza usando l'icona "proxy" della finestra standard. Ciò ti consente di fare clic tenendo premuto il tasto Comando per visualizzare il percorso, rivelarlo nel Finder o trascinarlo come qualsiasi altra cartella. Inoltre, il Terminale può utilizzarlo per creare un altro terminale nella stessa directory e per ripristinare la directory di lavoro quando si chiude / riavvia il Terminale (quando è abilitato Riprendi). Consente inoltre il ripristino delle directory per i gruppi di finestre.

È la stessa sequenza di escape OSC (Operating System Command) dei titoli di finestre e tabulazioni, ma con il primo parametro impostato su 7. Il valore dovrebbe essere un URL "file:", che abilita la codifica in percentuale di caratteri speciali in modo che possa gestire tutti i nomi di percorso validi. Dovresti anche includere il nome host in modo che Terminal possa determinare se si tratta di una directory locale; Il terminale eviterà di usarlo come directory di lavoro corrente se proviene da un host diverso.

Su una nota correlata, Terminal supporta allo stesso modo l'impostazione del "file rappresentato" usando la sequenza di escape OSC con un parametro di 6. Se impostato, l'icona del proxy mostrerà questo invece della directory di lavoro. Ad esempio, ho emacs e meno configurato per riflettere il file / buffer attualmente visualizzato nell'icona proxy. Ciò consente a questi programmi basati su tty di essere più integrati con il sistema operativo circostante.

I comportamenti della directory di lavoro sono abilitati per impostazione predefinita per bash (la shell predefinita su Mac OS X). Vedi / etc / bashrc per il codice pertinente.

Vale anche la pena ricordare che Lion Terminal ora supporta l'impostazione del titolo della scheda indipendentemente dal titolo della finestra usando la sequenza di escape OSC.


La update_terminal_cwdfunzione imposterà l'icona proxy sulla directory di lavoro corrente. Di default $PROMPT_COMMANDè update_terminal_cwd.
jtbandes,

@jtbandes Questo è ciò a cui mi riferivo quando ho scritto "I comportamenti della directory di lavoro sono abilitati per impostazione predefinita per bash ...".
Chris Page

Sì. Ho appena scoperto come funziona e ho pensato che potesse essere utile per i futuri googler!
jtbandes,

3

Oltre a raccomandare di utilizzare la specifica Comando sistema operativo sequenza di escape di Apple Terminal: ESC ] Ps ; Pt BELdove Psè 7ed Ptè un file:URL; vale la pena aggiungere che in Mac OS X 10.11 (e probabilmente dalla 10.7) c'è un file /etc/bashrc_Apple_Terminal(non modificabile in 10.11) che definisce il comodo update_terminal_cwd()come (senza i commenti):

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"
}

Puoi usarlo anche sulle tue caselle remote, nel caso in cui stavi pensando di farlo e poi grattarti la testa per codificare correttamente l'URL del file in bash.

E se cambi da PROMPT_COMMANDsolo .bash_profileo .bashrcpotresti dimenticare di chiamarlo. Nello stesso file mostrano un esempio di concatenamento un po 'meglio con:

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

Personalmente nel mio .bash_profilevolevo aggiungere il prompt git quindi ho fatto questo:

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

1

Le soluzioni di Bash che coinvolgono PS1 e PROMPT_COMMAND falliscono entrambe se la directory contiene caratteri Unicode (almeno su Snow Leopard). La migliore soluzione che potevo trovare era fare l'equivalente di

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

Purtroppo questo non funziona direttamente, quindi ho definito una funzione shell per fare la trchiamata:

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

Questo funziona bene per gli accenti latini, che saranno in Unicode NFD (gli accenti scompariranno ma il carattere latino sottostante rimarrà).

Sfortunatamente, fallirà completamente per cose come il cinese.


A partire da Mac OS X Lion 10.7, Terminal ha una sequenza di escape esplicita per l'impostazione della directory di lavoro. Utilizza un URL, quindi puoi utilizzare la codifica percentuale per caratteri speciali e supportare tutti i percorsi validi. Vedi la mia risposta a questa domanda per i dettagli.
Chris Page

1

Supponendo che si stia utilizzando il Terminale MAC predefinito, è possibile utilizzare quello seguente in .profile poiché "set_prompt" da solo potrebbe inviarti nella cartella principale quando si apre una nuova scheda:

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

0

Inserisci questo nel tuo ~ / .profile o file equivalente:

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

export PS1='\W \$ '

settitle `pwd`

La prima riga contiene due caratteri speciali che non possono essere copiati / incollati, ma è possibile scaricare il testo da qui: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .


1
"La prima riga contiene due caratteri speciali che non possono essere copiati / incollati" Invece di usare echouse printf, che ti permette di esprimere quei personaggi (ESC e BEL / Control-G) con sequenze di escape:printf '\e]0;$@\a"
Chris Page
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.