it-swarm-eu.dev

Imposta il titolo della finestra del terminale sulla directory corrente

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

71
kareman

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;%[email protected]%M | %~\a" } # title bar Prompt

Anche se le altre domande elencano i metodi bash, sono alias cd. Bash fornisce un metodo intrinseco che circoscrive 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 @ nomehost: directory":

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

dove\033 è il codice carattere per ESC, e\007 per BEL. Nota che il quoting è importante qui: le variabili sono espanse in "..." e non espanse in "...". Quindi Prompt_COMMAND è impostato su un valore non espanso, ma le variabili all'interno di "..." vengono espanse quando viene utilizzato Prompt_COMMAND.

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

Quindi, il seguente produce un prompt di "bash $" e un titolo xterm di "nomeutente @ nomehost: directory" ...

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

Notare l'uso di [...], che dice a bash di ignorare i caratteri di controllo non stampabili quando si calcola la larghezza del Prompt. In caso contrario, i comandi di modifica riga vengono confusi mentre si posiziona il cursore.

59
Darren Hall

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

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

31
Allisone

A partire da Mac OS X Lion 10.7, Terminal ha una sequenza di escape esplicita per l'impostazione della directory di lavoro, che viene visualizzata tramite l'icona "proxy" della finestra standard. Ciò ti consente di fare clic su Comando per visualizzare il percorso, rivelarlo nel Finder o trascinarlo come qualsiasi altra cartella. Inoltre, Terminal può utilizzare questo per creare un altro terminale nella stessa directory e ripristinare la directory di lavoro quando si chiude/riavvia Terminal (quando è abilitato Ripristino). Permette inoltre di ripristinare le directory per i gruppi di finestre.

È la stessa sequenza di escape del sistema operativo (OSC) come per i titoli di finestre e schede, ma con il primo parametro impostato su 7. Il valore dovrebbe essere un URL "file:", che abilita i caratteri speciali di codifica percentuale in modo che possa gestire tutti i percorsi 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 altro host.

Su una nota correlata, Terminal supporta similmente l'impostazione del "file rappresentato" utilizzando la sequenza di escape OSC con un parametro di 6. Se impostato, l'icona del proxy visualizzerà questa invece della directory di lavoro. Ad esempio, ho emacs e meno configurato per riflettere il file/buffer attualmente visualizzato nell'icona del 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.

Probabilmente è anche utile ricordare che Lion Terminal ora supporta l'impostazione del titolo della scheda indipendentemente dal titolo della finestra utilizzando la sequenza di escape OSC.

11
Chris Page

Oltre a raccomandare di utilizzare la sequenza di escape del comando del sistema operativo specifico di Apple Terminal: ESC ] Ps ; Pt BEL dove Ps è 7 e Pt è un file: URL; vale la pena di aggiungere che in Mac OS X 10.11 (e probabilmente dal 10.7) c'è un file /etc/bashrc_Apple_Terminal (non modificabile sotto 10.11) che definisce il conveniente update_terminal_cwd() as (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"
}

Potresti usarlo anche sui box remoti, nel caso stessimo pensando di farlo e poi grattarti la testa codificando correttamente l'URL del file in bash.

E se cambi Prompt_COMMAND nel tuo .bash_profile o .bashrc potresti dimenticarti di chiamare questo. 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_profile volevo aggiungere il prompt git così 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
3
dlamblin

Supponendo che tu stia usando il terminale MAC predefinito, puoi usare quello seguente in .profile dato che "set_Prompt" di per sé può inviarti alla cartella radice quando apri 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
1
Kopz Kyoto

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

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

Sfortunatamente questo non funziona direttamente, quindi ho definito una funzione Shell per effettuare la chiamata tr:

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.

1
Michael Norrish

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

function settitle() { echo -n "]0;[email protected]"; }
function cd() { command cd "[email protected]"; settitle `pwd -P`; }

export PS1='\W \$ '

settitle `pwd`

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

0
kareman